2017-07-14 1 views
1

J'utilise SQL Server 2014 et j'ai un problème avec une requête.
Je possède ce scénario ci-dessous:Ordre SQL par mais répéter les numéros de croissant

| Number | Series | Name | 
|--------|--------|---------| 
| 9 | 1 | Name 1 | 
| 5 | 3 | Name 2 | 
| 8 | 2 | Name 3 | 
| 7 | 3 | Name 4 | 
| 0 | 1 | Name 5 | 
| 1 | 2 | Name 6 | 
| 9 | 2 | Name 7 | 
| 3 | 3 | Name 8 | 
| 4 | 1 | Name 9 | 
| 0 | 1 | Name 10 | 

et je dois l'obtenir commandé par la colonne de la série comme ceci:

| Number | Series | Name | 
|--------|--------|---------| 
| 9 | 1 | Name 1 | 
| 8 | 2 | Name 3 | 
| 5 | 3 | Name 2 | 
| 7 | 1 | Name 5 | 
| 1 | 2 | Name 6 | 
| 0 | 3 | Name 4 | 
| 4 | 1 | Name 9 | 
| 9 | 2 | Name 7 | 
| 3 | 3 | Name 8 | 
| 0 | 1 | Name 10 | 

est en fait plus une Sequency dans la colonne « série » d'une ordenation.

1,2,3 à nouveau 1,2,3 ...

Quelqu'un pourrait-il me aider?

+0

Quel SGBD utilisez-vous? –

+1

Désolé, j'utilise SQL Server 2014 –

Répondre

1

Vous pouvez le faire en utilisant la fonction standard ANSI row_number():

select number, series, name 
from (select t.*, row_number() over (partition by series order by number) as seqnum 
     from t 
    ) t 
order by seqnum, series; 

Cette attribue « 1 » au premier enregistrement pour chaque série, « 2 » à la deuxième, et ainsi de suite. L'extérieur order by met alors tous les "1" ensemble, tous les "2" ensemble. Cela a pour effet d'entrelacer les valeurs de la série.

+0

Il ne donnera pas de résultat dans l'ordre prévu .. –

+0

@P ரதீப். . . Cela devrait maintenant J'ai mis dans la mauvaise deuxième clé pour la «commande par». –

+0

Cela a fonctionné pour moi, j'ai seulement changé la clause orderby dans la clause de partition à "name" et j'ai obtenu le résultat attendu. Merci beaucoup! –