2013-05-14 18 views
5

Mam pytanie, jak uzyskać najwyższą wartość, a następnie najniższą wartość, a następnie druga najwyższa wartość z tabeli.Jak uzyskać najwyższą, następnie najniższą, następnie drugą najwyższą, a następnie drugą najniższą wartość itd. Ze stołu

Na przykład: w tabeli

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

Wynik powinien wyglądać następująco:

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

Dzięki!

+1

świetne pytanie! Moje przeprosiny za obecność bliskich wyborców. Jakiej bazy danych używasz? (SQL Server, MySQL, PostgreSQL, Oracle, ...) – Andomar

+0

Używam SQL Server – user1861065

Odpowiedz

10

Jestem zakładając tag tsqlt miało być tsql, a ponadto, że oznacza to, że jest to dla serwera 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 

ten działa poprzez znalezienie numery wierszy podczas rozpatrywania listę klasyfikowane zarówno najwyższa -do-najniższych i najniższych-najwyższych (w Numbered, rnDesc i rnAsc). Następnie przyjmujemy najniższą liczbę wierszy, która została uzyskana przy rozważaniu któregokolwiek z tych zamówień (MixedNumbered, rnFin).

Powinno to wytworzyć dwa wiersze z rnFin równym 1, dwa wiersze z nim równe 2 i tak dalej; Parowanie najniższych rzędów i najniższych rzędów, aż dojdziemy do środka zestawu.

Następnie używamy tego do sortowania końcowego zestawu wyników - ale użyj pozycji uzyskanej przez uwzględnienie wartości posortowanych od najwyższego do najniższego (rnDesc) jako dzielnika łączącego między każdą parą wierszy o tej samej wartości rnFin. Oznacza to dla każdej pary, że wiersz o wyższej wartości pojawi się jako pierwszy.

Aby odwrócić wynik (najpierw najniższy, potem najwyższy, drugi najniższy, drugi najwyższy itd.), Potrzebujemy tylko zmienić końcową klauzulę ORDER BY na rnFin,rnAsc.

+0

Świetnie! To działa dobrze dla mnie ... Dziękuję !!! – user1861065

4

Przypisuje liczbę 2 do największego rzędu, 3 do najmniejszego, 4 do drugiego największego i tak dalej.

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

świetne pytanie! proszę sprawdzić moje spróbować:

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 
Powiązane problemy