DENSE_RANK() without duplication

后端 未结 4 930
一生所求
一生所求 2021-01-13 03:58

Here\'s what my data looks like:

| col1 | col2 | denserank | whatiwant |
|------|------|-----------|-----------|
| 1    | 1    | 1         | 1         |
| 2          


        
4条回答
  •  余生分开走
    2021-01-13 04:48

    Try this using window functions:

    with t(col1  ,col2) as (
    select 1 , 1 union all  
    select 2 , 1 union all  
    select 3 , 2 union all  
    select 4 , 2 union all  
    select 5 , 1 union all  
    select 6 , 2 union all  
    select 7 , 2 union all  
    select 8 , 3
    )
    select t.col1,
        t.col2,
        sum(x) over (
            order by col1
            ) whatyouwant
    from (
        select t.*,
            case 
                when col2 = lag(col2) over (
                        order by col1
                        )
                    then 0
                else 1
                end x
        from t
        ) t
    order by col1;
    

    Produces:

    It does a single table read and forms group of consecutive equal col2 values in increasing order of col1 and then finds dense rank on that.

    • x: Assign value 0 if previous row's col2 is same as this row's col2 (in order of increasing col1) otherwise 1
    • whatyouwant: create groups of equal values of col2 in order of increasing col1 by doing an incremental sum of the value x generated in the last step and that's your output.

提交回复
热议问题