当数据相同但日期不同时,我必须优化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中有可用的功能吗?

最佳答案

可以使用行号差异方法将具有相同值的连续行(按日期排序)分类到一个组中,并在遇到新值时重新开始一个新组。完成后,获取每组的minmax日期。

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/

10-15 22:23