PostgreSQL中的窗口函数尾随日期 [英] Window function trailing dates in PostgreSQL

查看:13
本文介绍了PostgreSQL中的窗口函数尾随日期的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试编写一个查询,将给定计算机今天的平均连接数与7到14天前的平均连接数进行比较。我认为这最好由窗口函数来处理,但我无法获得正确的日期语法。

假设我有一个名为iptable的IP地址和连接记录表,其中ourcreip、estinationip、Timestamp为列。以下是我针对前7天窗口尝试的查询,以仅获取每个来源的计数:

select 
  sourceip, 
  destinationip, 
  timestamp, 
  count(*) OVER (PARTITION BY sourceip order by timestamp
                 RANGE BETWEEN now() - '7 day'::Interval PRECEDING
                               now() - '14 day'::Interval FOLLOWING)
from
 iptable;

编写此类查询的最佳方法是窗口函数方法有意义吗,还是有更优化的方法来处理大型表的情况?

推荐答案

问题的一部分是您选择了一个糟糕的列名"timestamp"timestamp是内置数据类型的名称,因此要将其用作列名,必须在任何位置都使用它。

这还不是全部。您的窗口函数语法错误。请参见window function syntax。您忘记了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...
                                                             ^

这表明当前窗口函数实现不会执行您希望它执行的操作。很遗憾。

前面的值和后面的值当前仅 在行模式下允许。它们指示帧的开头或结尾为 当前行之前或之后的行。值必须为 不包含任何变量、聚合的整数表达式 函数或窗口函数。

相反,我只会在输入行上使用普通GROUP BYWHERE筛选器。

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;

这篇关于PostgreSQL中的窗口函数尾随日期的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆