2013-06-18 6 views
6

używam wersji PostgreSQL 9.1.9:dense_rank() według i null - jak sprawić, by traktowano je jako dno rankingu?

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" 

i mam proste tabeli (zwany test), który ma jeden zerowalne bigint kolumnę (zwany A). Tabela zawiera następujące dane:

NULL 
1 
2 

Teraz chcę utworzyć gęstą rankingu (a więc za pomocą funkcji dense_rank()), więc wykonać następujące zapytanie:

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

Powrócisz:

NULL,1 
2,2 
1,3 

Co ciekawe, jeśli ustawię dokładnie to samo w SQL Server 2008 R2 i uruchomię to samo zapytanie, ono zwróci:

2,1 
1,2 
NULL,3 

Tak, jestem zainteresowany, który jest poprawny, ale bardziej praktycznie, co chcę jest zachowanie SQL Server tak, jak mogę zrobić PostgreSQL traktować null jako dole rankingu?

(czyli null sortowania jako mniejsze niż wartość)

zauważyłem tego na stronie DENSE_RANK, ale nie mówi konkretnie o tej funkcji, ale być może jest to wskazówka?

Uwaga: średnia SQL definiuje null zobowiązań lub opcji null ołowiu, opóźnienie, FIRST_VALUE, last_value i nth_value zignorować. Nie jest to zaimplementowane w PostgreSQL: zachowanie jest zawsze takie samo, jak domyślne ustawienie standardu , a mianowicie RESPECT NULLS. Podobnie nie jest zaimplementowana standardowa opcja FROM FIRST lub FROM LAST dla nth_value: tylko jest zachowywane zachowanie domyślne FROM FIRST. (Można osiągnąć wynik z zeszłego przez odwrócenie kolejności zamawiając.)

Odpowiedz

7

Użyj klauzuli NULLS LAST zmodyfikować jak NULL wartości są sortowane. Robi dokładnie to, co prosiłeś:

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

Nie tylko dla funkcji okna, na ORDER BYnigdzie.

Postgres robi to, co trzeba, po wyjęciu z pudełka. Ponieważ NULL sortuje ostatnio w porządku rosnącym, domyślnie powinna pojawić się jako pierwsza, gdy zamówienie zostanie odwrócone.

pokrewne:

+0

świetnie - dzięki bardzo! (Myślałem, że postgresql może być poprawny, nawiasem mówiąc :-)) – kmp

Powiązane problemy