Comment get le plus haut, puis le plus bas, puis le deuxième plus haut, puis le deuxième plus bas et ainsi de suite d'une table

J'ai une question, comment puis-je get la valeur la plus élevée, puis la valeur la plus basse, puis la deuxième valeur la plus élevée d'une table.

Par exemple: dans le tableau

Name Value ---------------------- Apple 2 Pear 3 Pineapple 6 Mango 7 Kiwi 1 

Le résultat devrait ressembler à ceci:

 Name Value ----------------------- Mango 7 Kiwi 1 Pineapple 6 Apple 2 Pear 3 

Merci!

Je suppose que la balise tsqlt devait être tsql , et que cela implique que c'est pour le server SQL:

 ;with Numbered as ( select Name,Value, ROW_NUMBER() OVER (ORDER BY Value DESC) as rnDesc, ROW_NUMBER() OVER (ORDER BY Value ASC) as rnAsc from @t ), MixedNumbered as ( select Name,Value, CASE WHEN rnDesc < rnAsc THEN rnDesc ELSE rnAsc END as rnFin, rnAsc, rnDesc from Numbered ) select Name,Value from MixedNumbered order by rnFin,rnDesc 

Cela fonctionne en trouvant les numéros de ligne tout en considérant la list sortingée à la fois le plus haut au plus bas et le plus bas au plus haut (en Numbered , rnDesc et rnAsc ). Nous prenons ensuite le numéro de ligne le plus bas qui a été atteint en considérant l'un de ces ordres ( MixedNumbered , rnFin ).

Cela devrait alors produire deux lignes avec un rnFin égal à 1, deux lignes avec lui égal à 2, et ainsi de suite; en appariant les n e plus hautes et n eièmes rangées les plus basses jusqu'à atteindre le milieu de l'set.

Nous utilisons ensuite ceci pour sortinger le jeu de résultats final – mais utilisons la position obtenue en considérant les valeurs sortingées du plus haut au plus bas ( rnDesc ) comme étant le lien entre chaque paire de rangées ayant la même valeur rnFin . Cela signifie, pour chaque paire, que la ligne de valeur supérieure apparaîtra en premier.

Pour inverser le résultat (le plus bas d'abord, puis le plus haut, le deuxième plus bas, le deuxième plus haut, etc.), nous avons seulement besoin de changer la clause ORDER BY finale en rnFin,rnAsc .

Cela affecte le numéro 2 à la plus grande ligne, 3 au plus petit, 4 au deuxième plus grand, et ainsi de suite.

 select * from ( select 1 + 2 * row_number() over (order by Value asc) as rnAsc , 2 * row_number() over (order by Value desc) as rnDesc , t1.* from Table1 t1 ) SubQueryAlias order by case when rnDesc < rnAsc then rnDesc else rnAsc end 

Exemple à SQL Fiddle.

Une bonne question! S'il vous plaît vérifier mon essai:

 SELECT Name,Value FROM( SELECT *, MAX(Rnum) OVER() mx, MAX(Rnum) OVER()/2.0 hf FROM( SELECT *, ROW_NUMBER() OVER(ORDER BY value DESC) Rnum From @tbl )x )xx ORDER BY CASE WHEN Rnum-hf<=0 THEN Rnum ELSE mx-Rnum+1 END, Rnum