排名()与分区重复值
问题描述:
我想在“分区由”子句中重复值的sql服务器中使用排名函数,但我无法得到我所需要的。 这是我的查询:排名()与分区重复值
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, ē
答
您需要定义的组。这被称为“缺口 - 岛屿”问题。一种解决方案是行号的差异。为您的数据,这看起来像:
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()
。
为了理解这是如何工作的,我建议你在子查询中运行。盯着结果,直到你“得到”为什么差异定义你想要的组。
哇!这是超级有用的!非常感谢你@Gordon Linoff – Eithan