当数据相同但日期不同时,我必须优化select查询以获得更少的记录数。我需要按日期对所有行进行排序,并将所有行合并为一个行,直到找到不同的列值。通常数据如下。
date c_val
1/1/2016 200
2/1/2016 200
3/1/2016 300
4/1/2016 300
5/1/2016 300
6/1/2016 200
7/1/2016 200
那么我的输出应该如下。
start_date end_date c_val
1/1/2016 2/1/2016 200
3/1/2016 5/1/2016 300
6/1/2016 7/1/2016 200
我现在的问题是这样的:
select min(date) as start_date, max(date) as end_date, c_val
from t_ord
group by c_val;
但这实际上只返回了两条记录,因为它是用c值分组的。我想我需要额外的over来排序,并在找到新值时中断。
postgres中有可用的功能吗?
最佳答案
可以使用行号差异方法将具有相同值的连续行(按日期排序)分类到一个组中,并在遇到新值时重新开始一个新组。完成后,获取每组的min
和max
日期。
select min(date) as startdate,max(date) as enddate,c_val
from (select c_val,date,row_number() over(order by date)
-row_number() over(partition by c_val order by date) as grp
from t_ord
) t
group by c_val,grp;
关于sql - 在SQL中使用多组对记录进行分组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43278769/