postgresql SQL窗口函数和(日期+间隔)作为范围的边界

b09cbbtk  于 2023-06-05  发布在  PostgreSQL
关注(0)|答案(1)|浏览(138)

有没有办法使用硬边界的范围?
正确的代码是:

SELECT user_id,
       created_at,
       COUNT(*) OVER (ORDER BY created_at 
                      RANGE BETWEEN '30 days' PRECEDING 
                                AND '30 days' FOLLOWING) AS qty_in_period

但是这个样本是错误的:

SELECT user_id,
       created_at,
       COUNT(*) OVER (ORDER BY created_at 
                      RANGE BETWEEN UNBOUNDED PRECEDING 
                                AND (reg_date+interval) FOLLOWING) AS qty_in_period

reg_date是时间戳类型,间隔为'1 month'。
我知道,它可以用WHERE构造来完成,但我需要检查通过窗口函数来完成的可能性。
请帮帮我

nwnhqdif

nwnhqdif1#

有没有办法为RANGE使用硬边框?
没有。文件中对此有明确说明:
offset PRECEDINGoffset FOLLOWING框架选项中,offset必须是不包含任何变量、聚合函数或窗口函数的表达式。
尝试使用此类语法会引发以下错误:
错误:RANGE的参数不能包含变量
一种替代方法是使用相关子查询或横向连接。示例中的最后一个查询可以写成:

select user_id, created_at, x.*
from mytable t
cross join lateral (
    select count(*) qty_in_period
    from mytable t1
    where t1.created_at <= t.created_at + t.intval
) x

相关问题