SELECT-Ergebnis in "umgekehrter" Reihenfolge ausliefern

Hallo allerseits,


ich nutze eine komplexe Postgresql-Select-Abfrage, welche mir folgendes Resultat ausgibt:


gid
14548
14510
14511


Ich suche nun verzweifelt nach einer Möglichkeit, welche mir das Ergebnis “umgekehrt” ausgibt,
also dann so:


gid
14511
14510
14548

Gibt es so etwas in PostgreSQL?

Danke im voraus, Kai

Wie sortierst Du denn jetzt? Zwischen dem ersten Resultat und Deimem Wunsch-Resultat ist keine Logig erkennbar. Du sagst zwar umgekehrt, aber Zeile1 bleibt z.B. Zeile 1 und bei den Zahlen ist eher eine zufällige Sortierung zu sehen.

Also, erkläre Deinen Sortierwunsch!


Andreas

Hi Andreas,

danke erst mal für Deine Antwort.
Es ist keine klassische Sortierung nach Id, Zeitstempel oder ähnlichem geplant.

Im Augenblick führe ich eine SELECT-Anweisung durch, welche mir letztlich die Ids von räumlichen Daten ausgibt, welche dann in einer Karte gezeichnet werden.
Es geht um eine Routinganwendung und ich möchte, dass ich ausgeben kann

  1. id: 14511
    Straßenname: xyz
    Länge xyz

  2. id: 14510
    Straßenname: xyz
    Länge xyz

  3. id: 14548
    Straßenname: xyz
    Länge xyz

Dafür müsste ich eben die ausgegebenen Ergebnisse in Postgresql umdrehen, aber eben ohne Sortierung.

Ich möchte also, dass Zeile 1 die letzte Zeile wird, Zeile 2 die vorletzte etc.


Das macht es so schwierig.
Gibt es dafür wohl eine Lösung?

Was ist mit ‘gid’ geworden?

Egal:

test=*# select * from kai;
   t
-------
 14548
 14510
 14511
(3 rows)

test=*# select *, row_number() over () from kai;
   t   | row_number
-------+------------
 14548 |          1
 14510 |          2
 14511 |          3
(3 rows)

test=*# select t from (select *, row_number() over () from kai) foo order by row_number desc;
   t
-------
 14511
 14510
 14548
(3 rows)

Du siehst den Trick?


Andreas

Ah,
ich ahne was Du meinst.
So ganz klappt das hier aber noch nicht.

row_number() wird bei mir nicht als Funktion erkannt; diese müsste ich also erst erstellen?

Und wafür steht: row_number() over ()??

Viele Grüße, Kai

Das ist eine windowing-Funktion, gibt es ab 8.4. Du hast also noch kein 8.4, schlecht für dich …


Andreas

Alles klar, vielen Dank an dieser Stelle. :slight_smile:
Ich werde mir dann einmal 8.4 installieren.

Beste Grüße, Kai

Hrm:

test=*# create sequence seq_kai;
CREATE SEQUENCE
test=*# select t from (select *, nextval('seq_kai') as row_number from kai) foo order by row_number desc;
   t
-------
 14511
 14510
 14548
(3 rows)

Das funzt auch mit älteren Versionen. Schön ist aber was anderes. Insbesondere ist nicht schön, daß Du keinerlei Sortierung bisher hast und auf die Ausgabe von PG vertraust. Ohne Angabe einer Sortierung ist die Sortierung undefiniert und kann sich auch ändern. Zum beispiel wenn PG von einer Version zur nächsten die Realisierung von JOINS und anderen Dingen ändert. Ich komme jetzt nicht drauf, was das konkret war, aber zwischen 8.3 und 8.4 z.B. gab es da eine Änderung bei $irgendwas. Was bisher bei 8.3 sortiert rauskam (weil intern sortiert werden mußte) kommt in 8.4 unsortiert raus, weil aus Optimierungsgründen die interne Sortierung entfiel. Wer also in 8.3 darauf vertraute, daß das Resultat (zufällig) sortiert war, fällt damit mit 8.4 auf die Nase …


Andreas

Hallo Andreas,

danke für die Hinweise, ich werde auf kurz oder lang einmal auf 8.4 updaten;
im Augenblick klappt es auch wunderbar mit der Sequence.

Ncohmals danke für Deine Mühe, Kai

Hach, wenn es den Depesz nicht gäbe …

select * from depesz; » Blog Archive » Waiting for 8.4 – hash based DISTINCT

Andreas