2013-06-18 27 views
6

Ben Postgresql sürümünü 9.1.9 kullanıyorum:dense_rank() emriyle nulls - nasıl sıralamanın alt sırasına göre davranılır?

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" 

ve bir tek null bigint sütunu (denilen A) sahiptir (Test denir) basit bir tablo var. tablo aşağıdaki verileri sahiptir:

NULL 
1 
2 

Şimdi yoğun bir sıralama (dolayısıyla dense_rank() fonksiyonunu kullanarak) oluşturmak istiyorsanız bu yüzden aşağıdaki sorguyu yapın:

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

Bu döndürür:

NULL,1 
2,2 
1,3 

SQL Server 2008 R2'de tam olarak aynı şeyi kurup aynı sorguyu çalıştırırsam ilginç bir şekilde döner:

2,1 
1,2 
NULL,3 

Yani, ancak, daha pratik, istediğim SQL Server davranışı böylece, nasıl PostgreSQL sıralamasında dibine olarak null adlı tedavi yapabilirsiniz doğrudur kimin ilgileniyorum?

(herhangi bir değerden küçük olduğu yani sıralama nulls)

Ben DENSE_RANK sayfasında bu fark, ancak bu işlevi hakkında spesifik olarak konuşmuyor, ama belki de bir ipucudur?

Not: SQL standardı SAYGI NULLS tanımlar veya kurşun, lag, FIRST_VALUE last_value ve nth_value için boş değerlere seçeneği YOKSAY. Bu, PostgreSQL'te uygulanan değildir: davranış her zaman standardıyla aynıdır, yani SAYI NULLS. Benzer şekilde, standardın FROM LÜTFEN ya da nth_value için FROM LAST seçeneği uygulanmadı: sadece varsayılan FROM İLK davranışı desteklenir. (Sipariş verdikten TARAFINDAN SİPARİŞ tersine çevirerek SON GELEN ait sonucu elde edebilirsiniz.)

cevap

7

NULL değerler sıralanır nasıl değiştirmek için NULLS LAST maddesini kullanın. Does tam olarak ne istedi: pencere fonksiyonları için ORDER BYyerde için değil sadece

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

.

Postgres kutudan doğru olanı yapar. NULL sıraları artan düzende devam ettiğinden, sipariş ters olduğunda varsayılan olarak ilk önce gelmelidir.

İlgili:

+0

harika - çok teşekkür! (Postgresql'in doğru olanı olabileceğini düşündüm, bu arada :-)) – kmp

İlgili konular