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.
Gute Frage! Ich entschuldige mich für die Anwesenheit enger Wähler. Welche Datenbank verwendest du? (SQL Server, MySQL, PostgreSQL, Oracle, ...) – Andomar
Ich benutze SQL Server – user1861065