PostgreSQL组由间隔

时间:2018-02-14 07:33:22

标签: sql postgresql

嗯,我有一套看似简单的数据,但它给我带来了很多麻烦。

这是我的数据的示例:

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

我需要总结一下"数量"按" price1"分组的列和" price2"这将是非常容易的,但我需要考虑" price1"的时间变化。和" price2"。数据按" date"排序。

我需要的是最后一行没有与前两行分组,尽管它具有相同的值" 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

有关SQL查询的任何建议吗?

2 个答案:

答案 0 :(得分:1)

这是一个差距和岛屿问题。使用以下代码:

select sum(quantity), price1, price2, min(date) dateStart, max(date) dateend 
from
(
    select *,
           row_number() over (order by date) -
           row_number() over (partition by price1, price2 order by date) grp
    from data
) t
group by price1, price2, grp
order by dateStart

dbfiddle demo

该解决方案基于price1price2的连续序列的识别,这是通过创建grp列来完成的。隔离连续序列后,您也可以使用grp执行一个简单的组。

答案 1 :(得分:0)

我改变了一点接受的答案来捕捉彼此相邻的两行“date”列完全相同的情况。我添加了第二个参数,因此它们将以正确的顺序排序(我的表有“oid”列)

select sum(quantity), price1, price2, min(date) dateStart, max(date) dateend 
from
(
    select *,
           row_number() over (order by date, oid) -
           row_number() over (partition by price1, price2 order by date, oid) grp
    from data
) t
group by price1, price2, grp
order by dateStart