使用组和滞后及其他可能方式的Postgres窗口功能

时间:2018-11-15 18:43:37

标签: postgresql group-by lag

假设我有下表,我只想返回上一行中价格!=价格的行,而只返回按时间分组的组中的行

ID :           {    1   ,  2      ,      3   ,    4    ,    5    ,    6 }

Time        : { 09:20:00, 09:20:00,  09:20:00, 09:20:01, 09:20:02, 09:20:03 }

Price :       {   100   , 100     ,  101     , 102     ,   102   ,   103 }

由于按时间分组,返回的输出应为:

ID                   : {   1     ,    3    ,    4    ,   5      ,  6 }
Time                 : { 09:20:00, 09:20:00, 09:20:01, 09:20:02 , 09:20:03 }
Price :                {   100   ,  101    ,  102     , 102     , 103 }

请注意,尽管输出与09:20:01的价格相同,但输出在09:20的价格中丢弃了100个价格,但在09:20:02的价格中并未舍弃102个价格,因为必须进行分组按时间。有人可以通过postgres查询帮助我吗?

1 个答案:

答案 0 :(得分:1)

SELECT time, price
FROM mytable
WHERE price <> coalesce(
                  lag(price) OVER (PARTITION BY time ORDER BY id),
                  price - 1
               )
ORDER BY time, id;

coalesce处理每个分区中第一个元素出现的NULL值。