Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带间隔的PostgreSQL分组依据_Sql_Postgresql - Fatal编程技术网

带间隔的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行数可以使用自连接进行模拟: