当前位置:  开发笔记 > 编程语言 > 正文

窗口函数LAG可以引用正在计算值的列吗?

如何解决《窗口函数LAG可以引用正在计算值的列吗?》经验,为你挑选了0个好方法。

我需要根据当前记录的其他一些列和前一条记录的X值(使用一些分区和顺序)计算某些列X的值.基本上我需要在表单中实现查询

SELECT , 
  

这是不可能的,因为只有现有的列可以在窗口函数中使用,所以我正在寻找如何克服这一点.

这是一个例子.我有一张活动表.每个活动都有typetime_stamp.

create table event (id serial, type integer, time_stamp integer);

我不想找到"重复"事件.副本我的意思是以下.让我们typetime_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_stamptime_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.

所以问题:我可以重写这个查询以达到我需要的效果吗?

推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有