2017-10-18 57 views
0

我想在“分区由”子句中重复值的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, ē

回答

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

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

+0

哇!这是超级有用的!非常感谢你@Gordon Linoff – Eithan