rank() 在分区中具有重复值

  • 本文关键字:分区 rank sql sql-server
  • 更新时间 :
  • 英文 :


我正在尝试在 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()

要了解其工作原理,我建议您在子查询中运行。 盯着结果,直到你"明白"为什么差异定义了你想要的组。

最新更新