我需要根据当前记录的其他一些列和前一条记录的X值(使用一些分区和顺序)计算某些列X的值.基本上我需要在表单中实现查询
SELECT,
这是不可能的,因为只有现有的列可以在窗口函数中使用,所以我正在寻找如何克服这一点.
这是一个例子.我有一张活动表.每个活动都有type
和time_stamp
.
create table event (id serial, type integer, time_stamp integer);
我不想找到"重复"事件.副本我的意思是以下.让我们type
按time_stamp
升序给出所有事件.然后
第一个事件不重复
所有跟随非重复且在其后的某个时间范围内的事件(即它们time_stamp
不大于time_stamp
之前的非重复加上某些常量TIMEFRAME
)是重复的
下一个事件,time_stamp
如果大于先前的非重复次数超过TIMEFRAME
不重复
等等
对于这个数据
insert into event (type, time_stamp) values (1, 1), (1, 2), (2, 2), (1,3), (1, 10), (2,10), (1,15), (1, 21), (2,13), (1, 40);
和TIMEFRAME=10
结果应该是
time_stamp | type | duplicate ----------------------------- 1 | 1 | false 2 | 1 | true 3 | 1 | true 10 | 1 | true 15 | 1 | false 21 | 1 | true 40 | 1 | false 2 | 2 | false 10 | 2 | true 13 | 2 | false
我可以duplicate
根据当前time_stamp
和time_stamp
之前的非重复事件来计算字段的值,如下所示:
WITH evt AS ( SELECT time_stamp, CASE WHEN time_stamp - LAG(current_non_dupl_time_stamp) OVER w >= TIMEFRAME THEN time_stamp ELSE LAG(current_non_dupl_time_stamp) OVER w END AS current_non_dupl_time_stamp FROM event WINDOW w AS (PARTITION BY type ORDER BY time_stamp ASC) ) SELECT time_stamp, time_stamp != current_non_dupl_time_stamp AS duplicate
但这不起作用,因为计算的字段不能在以下内容中引用LAG
:
ERROR: column "current_non_dupl_time_stamp" does not exist.
所以问题:我可以重写这个查询以达到我需要的效果吗?