嗯,我有一套看似简单的数据,但它给我带来了很多麻烦。
这是我的数据的示例:
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查询的任何建议吗?
答案 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
该解决方案基于price1
和price2
的连续序列的识别,这是通过创建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