Window functions and more “local” aggregation

后端 未结 3 2027
旧巷少年郎
旧巷少年郎 2020-12-11 04:31

Suppose I have this table:

select * from window_test;

 k | v
---+---
 a | 1
 a | 2
 b | 3
 a | 4

Ultimately I want to get:



        
3条回答
  •  生来不讨喜
    2020-12-11 05:14

    This returns your desired result with the sample data. Not sure if it will work for real world data:

    select k, 
           min(v) over (partition by group_nr) as min_v,
           max(v) over (partition by group_nr) as max_v
    from (
        select *,
               sum(group_flag) over (order by v,k) as group_nr
        from (
        select *,
               case
                  when lag(k) over (order by v) = k then null
                  else 1
                end as group_flag
        from window_test
        ) t1
    ) t2
    order by min_v;
    

    I left out the DISTINCT though.

提交回复
热议问题