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

Eit*_*han 0 sql sql-server

我正在尝试在sql server中使用rank函数并在"partition by"子句中重复使用值,但我无法得到我需要的内容.这是我的查询:

select jobID, runStatus, 
rank() over (partition by runStatus order by jobID ) as rank
from table
Run Code Online (Sandbox Code Playgroud)

我得到:

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,E

Gor*_*off 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;
Run Code Online (Sandbox Code Playgroud)

您的数据没有重复,因此row_number()似乎可以执行您想要的操作.无论是在外部查询中rank()还是row_number()在外部查询中,您都需要row_number()在内部查询中.

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