2017-10-18 1 views
0

J'essaie d'utiliser la fonction rank dans sql server avec une valeur répétée dans la clause "partition by", mais je ne peux pas obtenir exactement ce dont j'ai besoin. Voici ma requête:rank() avec la valeur répétée dans la partition

select jobID, runStatus, 
rank() over (partition by runStatus order by jobID) as rank 
from table 

et je reçois:

 
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 

mais ce que je vraiment besoin est:

 
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 

ce qui signifie que le rang sera initialisé tous les changements dans la colonne runStatus .

Pouvez-vous m'aider avec cela?

TNX, E

Répondre

5

Vous devez définir les groupes. C'est ce qu'on appelle un problème de "gap-and-islands". Et une solution est la différence des numéros de ligne. Pour vos données, cela ressemble à:

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; 

Vos données n'a pas de doublons, donc row_number() semble faire ce que vous voulez. Indépendamment du rank() ou row_number() dans la requête externe, vous voulez row_number() dans la requête interne.

Pour comprendre comment cela fonctionne, je vous recommande d'exécuter en sous-requête. Observez les résultats jusqu'à ce que vous compreniez pourquoi la différence définit les groupes que vous voulez.

+0

WOW! C'est super utile! merci beaucoup @Gordon Linoff – Eithan