带间隔的PostgreSQL分组依据
嗯,我有一组看似简单的数据,但它给我带来了很多麻烦 这是我的数据的一个示例:带间隔的PostgreSQL分组依据,sql,postgresql,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 1
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的时间变化。数据按日期排序
我需要的是最后一行不与前两行分组,尽管它的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查询有什么建议吗?这是一个缺口和孤岛问题。使用以下代码:
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
该解决方案基于对price1和price2的连续序列的识别,这是通过创建grp列来完成的。一旦你分离出连续的序列,那么你也可以使用grp进行简单的分组。我稍微改变了一点公认的答案,以捕捉相邻两行的日期列完全相同的情况。我添加了第二个参数,因此它们将按正确的顺序排列。我的表有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
奇怪的是,在少数情况下,当两行的日期和时间完全相同时,会产生新的间隔。有什么帮助吗?@GeorgiBonchev你能在dbfiddle中准备一个例子吗?没关系,我在order by中添加了第二个参数oid,它工作得很好,不幸的是,在旧版本的PostgreSQL(如8.0)中不支持分区比。有没有办法在PostgreSQL 8.0中运行此功能?@GeorgiBonchev行数可以使用自连接进行模拟: