DENSE_RANK()没有重复

Man*_*eld 5 sql sql-server dense-rank sql-server-2016

这是我的数据:

| col1 | col2 | denserank | whatiwant |
|------|------|-----------|-----------|
| 1    | 1    | 1         | 1         |
| 2    | 1    | 1         | 1         |
| 3    | 2    | 2         | 2         |
| 4    | 2    | 2         | 2         |
| 5    | 1    | 1         | 3         |
| 6    | 2    | 2         | 4         |
| 7    | 2    | 2         | 4         |
| 8    | 3    | 3         | 5         |
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止的查询:

SELECT col1, col2, DENSE_RANK() OVER (ORDER BY COL2) AS [denserank]
FROM [table1]
ORDER BY [col1] asc
Run Code Online (Sandbox Code Playgroud)

我想要实现的是,每当col2的值发生变化时,我的密集列都会递增(即使值本身被重用).我实际上无法通过我密集的列来命令,所以这不起作用).有关whatiwant示例,请参阅该列.

有没有办法实现这一目标DENSE_RANK()?还是有替代方案吗?

Gur*_*ngh 3

使用窗口函数尝试一下:

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;
Run Code Online (Sandbox Code Playgroud)

生产:

在此输入图像描述

它执行单个表读取并按 col1 的递增顺序形成连续相等的 col2 值组,然后在其上找到密集排名。

  • x:如果上一行的 col2 与本行的 col2 相同(按递增顺序col1),则赋值 0,否则赋值 1
  • whatyouwant:通过对上一步中生成的值col2进行增量求和,按递增顺序创建相等值的组,这就是您的输出。col1x