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
.
świetne pytanie! Moje przeprosiny za obecność bliskich wyborców. Jakiej bazy danych używasz? (SQL Server, MySQL, PostgreSQL, Oracle, ...) – Andomar
Używam SQL Server – user1861065