我正在尝试在sql server中使用rank函数并在"partition by"子句中重复使用值,但我无法得到我需要的内容.这是我的查询:
select jobID, runStatus,
rank() over (partition by runStatus order by jobID ) as rank
from table
Run Code Online (Sandbox Code Playgroud)
我得到:
jobID runStatus rank 10 s 9 9 s 8 8 s 7 7 s 6 6 s 5 5 s 4 4 f 1 3 s 3 2 s 2 1 s 1
但我真正需要的是:
jobID runStatus rank desire 10 s 6 9 s 5 8 s 4 7 s 3 6 s 2 5 s 1 4 f 1 3 s 3 2 s 2 1 s 1
意味着将在runStatus列中的每次更改时初始化排名.
你能帮助我吗?
tnx,E
您需要定义组.这被称为"间隙和岛屿"问题.一种解决方案是行数的差异.对于您的数据,这看起来像:
select jobID, runStatus,
row_number() over (partition by runStatus, seqnum - seqnum_rs
order by jobID
) as rank
from (select t.*,
row_number() over (order by jobId) as seqnum,
row_number() over (partition by runStatus order by jobId) as seqnum_rs
from t
) t;
Run Code Online (Sandbox Code Playgroud)
您的数据没有重复,因此row_number()似乎可以执行您想要的操作.无论是在外部查询中rank()还是row_number()在外部查询中,您都需要row_number()在内部查询中.
要了解其工作原理,我建议您在子查询中运行.盯着结果,直到你"得到"为什么差异定义了你想要的组.