我正在尝试在sql server中使用rank函数并在“partition by”子句中重复使用值,但我无法得到我需要的内容。 这是我的问题:
select jobID, runStatus,
rank() over (partition by runStatus order by jobID ) as rank
from table
我得到了:
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, ë
答案 0 :(得分:5)
您需要定义组。这被称为“间隙和岛屿”问题。一种解决方案是行数的差异。对于您的数据,这看起来像:
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;
您的数据没有重复,因此row_number()
似乎可以执行您想要的操作。无论外部查询中的rank()
或row_number()
如何,您都希望在内部查询中使用row_number()
。
要了解其工作原理,我建议您在子查询中运行。盯着结果,直到你“得到”为什么差异定义了你想要的组。