在sql中具有多个集合的组记录

时间:2017-04-07 12:55:53

标签: sql postgresql

我必须优化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中是否有任何功能?

2 个答案:

答案 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)

  1. 您可以对值使用lag窗口函数来获取后续行(列change)中的差异。

  2. 然后将其作为窗口函数提供给sum函数,以生成值组(gr列)。

  3. 如果您拥有未更改值的序列组,则可以按此组和值本身进行分组,并获取每个组的最小和最大日期。

  4. 以下是查询:

    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;