2013-06-18 10 views
6

Ich bin mit Postgresql Version 9.1.9:dose_rank() order by und nulls - wie man sie als unteren Rand der Rangliste behandelt?

select version(); 
"PostgreSQL 9.1.9 on armv7l-unknown-linux-gnueabihf, 
compiled by gcc (Debian 4.6.3-14+rpi1) 4.6.3, 32-bit" 

und ich habe eine einfache Tabelle (als Test bezeichnet wird), die eine einzige Nullable-bigint Spalte (genannt A). Die Tabelle hat folgende Daten:

NULL 
1 
2 

Jetzt möchte ich ein dichtes Ranking erstellen (also mit der dense_rank() Funktion) so dass ich die folgende Abfrage:

select "A", dense_rank() over (order by "A" desc) from public."Test" 

Das gibt:

NULL,1 
2,2 
1,3 

Interessanterweise, wenn ich genau dasselbe in SQL Server 2008 R2 einrichten und dieselbe Abfrage ausführen, wird zurückgegeben:

So
2,1 
1,2 
NULL,3 

, Ich interessiere mich für das richtig ist, aber mehr praktisch, was ich will, ist das Verhalten von SQL Server so, wie kann ich PostgreSQL die Null als Ende der Liste behandeln?

(das heißt Art NULLS als kleiner als jeder Wert)

Ich bemerkte dies auf der DENSE_RANK Seite, aber es ist nicht speziell über diese Funktion zu sprechen, aber vielleicht ist es ein Hinweis?

Hinweis: Der SQL-Standard definiert eine RESPECT NULLS oder IGNORE NULLS Option für Blei, Verzögerung, FIRST_VALUE, last_value und nth_value. Dies ist nicht in PostgreSQL implementiert: das Verhalten ist immer das gleiche wie der Standard Standard, nämlich RESPECT NULLS. Ebenso ist die Option FROM FIRST oder FROM LAST des Standards für nth_value nicht implementiert: Nur Das Standardverhalten FROM FIRST wird unterstützt. (Können Sie erreichen das Ergebnis FROM LAST durch die ORDER BY Umkehr der Bestellung.)

Antwort

7

Verwenden Sie die NULLS LAST Klausel zu ändern, wie NULL Werte sortiert werden. Ist genau das, was Sie gefragt:

SELECT "A", dense_rank() OVER (ORDER BY "A" DESC NULLS LAST) 
FROM public."Test"

Nicht nur für Fensterfunktionen, für ORDER BYüberall.

Postgres macht das Richtige aus der Box. Da die Sortierung NULL in aufsteigender Reihenfolge erfolgt, sollte sie standardmäßig zuerst angezeigt werden, wenn die Reihenfolge invertiert wird.

Verwandte:

+0

super - vielen Dank! (Ich dachte postgresql könnte übrigens der richtige sein :-)) – kmp