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()?还是有替代方案吗?
使用窗口函数尝试一下:
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,否则赋值 1whatyouwant:通过对上一步中生成的值col2进行增量求和,按递增顺序创建相等值的组,这就是您的输出。col1x| 归档时间: |
|
| 查看次数: |
457 次 |
| 最近记录: |