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

时间:2017-10-18 12:01:43

标签: sql sql-server

我正在尝试在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, ë

1 个答案:

答案 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()

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