我必须优化select查询以减少no。我们有相同数据但日期不同的记录。我需要按日期对所有行进行排序,并将所有行组合成一行,直到找到不同的列值。通常,数据如下。
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_val分组的。我认为我需要额外的订购和中断时找到新的价值。 postgres中是否有任何功能?
答案 0 :(得分:3)
您可以使用行号方法的差异将连续行(按日期排序)与相同的c_val分类到一个组中,并在遇到新值时重新开始新组。完成此操作后,每个c_val获取每个组的fct_evkuzmin
--file_mta
----20170202A(some_random_string)mta.gz
----20170202B(some_random_string)mta.gz
fct_evkuzmin
--file_dfr
----20170202A(some_random_string)dfr.gz
----20170202B(some_random_string)dfr.gz
和min
日期。
max
答案 1 :(得分:1)
您可以对值使用lag
窗口函数来获取后续行(列change
)中的差异。
然后将其作为窗口函数提供给sum
函数,以生成值组(gr
列)。
如果您拥有未更改值的序列组,则可以按此组和值本身进行分组,并获取每个组的最小和最大日期。
以下是查询:
select
min(date) as start_date, max(date) as end_date, c_val
from (
select
c_val, sum(change) over (order by date) as gr, date
from (
select
c_val,
case when lag(c_val) over (order by date) <> c_val then 1 else 0 end as change,
date
from t_ord
) seq_change
) groups_of_values
group by c_val,gr
order by start_date;