我正在尝试在 sql 服务器中使用排名函数,并在"分区依据"子句中使用重复值,但我无法准确获得我需要的东西。这是我的查询:
select jobID, runStatus,
rank() over (partition by runStatus order by jobID ) as rank
from table
我得到:
作业 ID 运行状态排名10 秒 99 秒 88 秒 77 秒 66 秒 55 秒 44 F 13 秒 32 秒 21 秒 1
但我真正需要的是:
作业 ID 运行状态排名愿望10 秒 69 秒 58 秒 47 秒 36 秒 25 秒 14 F 13 秒 32 秒 21 秒 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;
您的数据没有重复项,因此row_number()
似乎可以执行您想要的操作。 无论外部查询中的rank()
或row_number()
如何,您都希望在内部查询中row_number()
。
要了解其工作原理,我建议您在子查询中运行。 盯着结果,直到你"明白"为什么差异定义了你想要的组。