您的部分问题是您选择了一个糟糕的列名,"timestamp"
. timestamp
是内置数据类型的名称,因此要将其用作列名,您必须"double quote"
在任何地方使用它。
不过,这还不是全部。您的窗口函数语法错误。请参阅窗口函数语法。你忘了AND
; 它是RANGE BETWEEN .. PRECEDING AND ... FOLLOWING
。
此外,虽然这不是问题的原因,但您应该使用 SQL 标准current_timestamp
而不是now()
.
这会让你遇到一个新错误:
CREATE TABLE iptable ( sourceip cidr, destinationip cidr, "timestamp" timestamptz);
regress=> select
sourceip,
destinationip,
timestamp,
count(*) OVER (PARTITION BY sourceip order by "timestamp" RANGE BETWEEN current_timestamp - '7 day'::Interval PRECEDING AND current_timestamp - '14 day'::Interval FOLLOWING)
from
iptable;
ERROR: RANGE PRECEDING is only supported with UNBOUNDED
LINE 5: ... OVER (PARTITION BY sourceip order by "timestamp" RANGE BETW...
^
这表明当前的窗口函数实现不会做你想做的事。可悲的是。
值 PRECEDING 和值 FOLLOWING 情况目前仅允许在 ROWS 模式下使用。它们指示帧以当前行之前或之后的行数开始或结束。value 必须是不包含任何变量、聚合函数或窗口函数的整数表达式。
相反,我只是在输入行上使用GROUP BY
带有过滤器的普通文本。WHERE
select
sourceip,
count(sourceip) AS n_conns_7_to_14_days_ago
from
iptable
WHERE age("timestamp") BETWEEN INTERVAL '7' DAY AND INTERVAL '14' DAY
GROUP BY sourceip;