2017-10-18 60 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