2013-05-14 7 views
5

Ich habe eine Frage, wie kann ich den höchsten Wert, dann den niedrigsten Wert, dann der zweithöchste Wert aus einer Tabelle.Wie bekomme ich die höchste, dann die niedrigste, dann die zweite hoch, und dann die zweitniedrigste Wert und so weiter von einer Tabelle

Zum Beispiel: in der Tabelle

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

Ergebnis soll wie folgt aussehen:

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

Dank!

+1

Gute Frage! Ich entschuldige mich für die Anwesenheit enger Wähler. Welche Datenbank verwendest du? (SQL Server, MySQL, PostgreSQL, Oracle, ...) – Andomar

+0

Ich benutze SQL Server – user1861065

Antwort

10

Ich gehe davon aus dem tsqlt Tag tsql sein sollte, und ferner, dass dies bedeutet, dass diese für SQL Server ist:

;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 

Dies funktioniert, indem die Zeilennummern zu finden, während die Liste unter Berücksichtigung sortierten sowohl höchste - am niedrigsten und am niedrigsten am höchsten (in Numbered, rnDesc und rnAsc). Wir nehmen dann die unterste Zeilennummer, die erreicht wurde, wenn eine dieser Anordnungen in Betracht gezogen wurde (MixedNumbered, rnFin).

Dies sollte dann zwei Zeilen mit einem rnFin gleich 1, zwei Zeilen mit ihm gleich 2, und so weiter; Paarung n th höchste und n ten untersten Reihen, bis wir die Mitte des Satzes erreichen.

Dann sortieren wir die endgültige Ergebnismenge - aber verwenden Sie die Position, indem Sie die Werte sortiert nach höchsten bis niedrigsten (rnDesc) als Bindeglied zwischen jedem Zeilenpaar mit demselben rnFin Wert betrachten. Dies bedeutet, dass für jedes Paar die höherwertige Zeile zuerst angezeigt wird.

Um das Ergebnis umzukehren (niedrigste zuerst, dann höchste, zweitniedrigste, zweithöchste usw.), müssen wir nur die letzte ORDER BY Klausel zu ändern.

+0

Großartig! Das funktioniert gut für mich ... Danke !!! – user1861065

4

Damit wird der größten Reihe die Zahl 2 zugewiesen, 3 der kleinsten Reihe, 4 der zweitgrößten Reihe und so weiter.

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 

Example at SQL Fiddle.

0

Eine große Frage! Bitte überprüfen Sie meinen Versuch:

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 
Verwandte Themen