PostgreSQL组由间隔但没有窗口函数

时间:2018-02-21 11:01:48

标签: sql postgresql gaps-and-islands

这是我上一个问题的后续行动:

PostgreSQL group by with interval

有一个非常好的答案但不幸的是它没有使用PostgreSQL 8.0 - 一些客户仍然使用这个旧版本。

所以我需要在不使用窗口函数的情况下找到另一种解决方案

以下是我的表格:

   id quantity  price1  price2 date
    1  100       1       0      2018-01-01 10:00:00
    2  200       1       0      2018-01-02 10:00:00
    3  50        5       0      2018-01-02 11:00:00
    4  100       1       1      2018-01-03 10:00:00
    5  100       1       1      2018-01-03 11:00:00
    6  300       1       0      2018-01-03 12:00:00

我需要总结"数量"按" price1"分组和" price2"但只有当他们改变时

所以最终结果应如下所示:

quantity price1 price2 dateStart            dateEnd
300      1      0      2018-01-01 10:00:00  2018-01-02 10:00:00 
50       5      0      2018-01-02 11:00:00  2018-01-02 11:00:00
200      1      1      2018-01-03 10:00:00  2018-01-03 11:00:00
300      1      0      2018-01-03 12:00:00  2018-01-03 12:00:00

1 个答案:

答案 0 :(得分:2)

效率不高,但您可以使用子查询实现相同的逻辑:

select sum(quantity), price1, price2,
       min(date) as dateStart, max(date) as dateend 
from (select d.*,
             (select count(*)
              from data d2
              where d2.date <= d.date
             ) as seqnum,
             (select count(*)
              from data d2
              where d2.price1 = d.price1 and d2.price2 = d.price2 and d2.date <= d.date
             ) as seqnum_pp
      from data d
     ) t
group by price1, price2, (seqnum - seqnum_pp)
order by dateStart