
Zitat von
az_hf0
Hallo zusammen,
mir ist heute eine etwas ungewöhnliche Frage eingefallen, die ich gerne mal mit euch diskutieren wollte.
Angenommen, ich habe eine Tabelle mit Werten wie:
select * from bereiche order by name;
name, wert
Bereich1, 100
Bereich2, 200
Bereich3, 20
Bereich4, 150
Bereich5, 300
Der Hintergrund: Wenn man diese in einem Tortendiagramm ausgeben möchte, wäre es besonders übersichtlich, wenn man immer einen größeren Bereich neben einem kleineren Bereich platzieren würde. Zwei kleinere Bereiche nebeneinander sind schlechter lesbar.
Dabei hätte ich überlegt, wie man denn mit Postgres alternierend sortieren kann. Also so:
Bereich5, 300
Bereich3, 20
Bereich2, 200
Bereich4, 150
Bereich1, 100
Ich habe allerdings keine leichte Lösung gefunden. Klar könnte man mit einer Funktion mitzählen oder modulo2-artig eine Zählspalte mit Sortiergrößen befüllen, aber mich hätte interessiert, ob jemand einen einfacheren Weg kennt, der direkt über das order by führt?
select * from bereiche order by XYZ?;
Würde mich freuen, wenn jemand eine intressante oder trickreiche Lösung kennt.
az_hf0
Nettes Problem...
Ich denke mal, mittels den CTE-Funktionen von 8.4 könnte man da was machen, vielleicht in dieser Art:
Code:
test=*# select * from bereiche;
name | wert
----------+------
bereich1 | 100
bereich2 | 200
bereich3 | 20
bereich4 | 150
bereich5 | 300
(5 Zeilen)
Zeit: 0,204 ms
test=*# select name, wert from (select *, row_number() over (order by wert desc) from bereiche) foo order by (case when row_number % 2 = 1 then row_number else (select count(1)-row_number from bereiche) end);
name | wert
----------+------
bereich5 | 300
bereich1 | 100
bereich2 | 200
bereich4 | 150
bereich3 | 20
(5 Zeilen)
Die Abfrage:
Code:
test=*# select name, wert, row_number from (select *, row_number() over (order by wert desc) from bereiche) foo;
name | wert | row_number
----------+------+------------
bereich5 | 300 | 1
bereich2 | 200 | 2
bereich4 | 150 | 3
bereich1 | 100 | 4
bereich3 | 20 | 5
(5 Zeilen)
liefert mir eine Zeilennummer, in der Sortierung ist mein Plan, je nachdem ob diese gerade oder ungerade ist in der sortierten Menge mal von oben und mal von unten zu zählen.
Ich bin mir aber nicht ganz sicher, ob dies wirklich für alle möglichen Konstellationen funktioniert.
Vielleicht fällt ja jemand noch was besseres ein...
Andreas
Lesezeichen