【问题标题】:PostgreSQL group by with intervalPostgreSQL 分组按间隔
【发布时间】:2018-02-14 07:33:21
【问题描述】:

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

这是我的数据的示例:

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”分组的“quantity”列,这很容易,但我需要考虑“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 查询有什么建议吗?

【问题讨论】:

    标签: sql postgresql


    【解决方案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 进行简单分组。

    【讨论】:

    • 奇怪,在少数情况下,当两行的日期和时间完全相同时,它会产生新的间隔。有什么帮助吗?
    • @GeorgiBonchev 你能在 dbfiddle 中准备一个例子吗?
    • 没关系,我在“order by”中添加了第二个参数(oid)并且它起作用了
    • 好吧,不幸的是,像 8.0 这样的 PostgreSQL 旧版本不支持“过度分区”。有没有办法在 PostgreSQL 8.0 中运行它?
    • @GeorgiBonchev row_number 可以使用自联接模拟:stackoverflow.com/questions/1895110/row-number-in-mysql
    【解决方案2】:

    我稍微改变了公认的答案,以捕捉相邻两行的“日期”列完全相同的情况。我添加了第二个参数,因此它们将按正确顺序排序(我的表有“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
    

    【讨论】:

      猜你喜欢
      • 2019-06-28
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 2011-12-20
      • 2020-11-23
      • 2011-02-08
      • 2018-10-12
      相关资源
      最近更新 更多