2013-06-18 10 views
6

私は、PostgreSQLバージョン9.1.9使用しています:dense_rank()order byとnulls - ランキングの最下位として扱う方法

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" 

を、私は(Aと呼ばれる)、単一のNULL可能bigintの列を持っている(テストと呼ばれる)単純なテーブルを持っています。テーブルには、次のデータがあります。

NULL 
1 
2 

は、今私は(それゆえdense_rank()機能を使用して)密なランキングを作成したいので、私は次のクエリを実行します。

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

これが返されます。

NULL,1 
2,2 
1,3 

興味深いことに、SQL Server 2008 R2で同じことを設定して同じクエリを実行すると、返されるメッセージは次のようになります。

2,1 
1,2 
NULL,3 

だから、私は正しいが誰であるかに興味を持っていますが、より実用的に、私がしたいことはそうSQL Serverの動作である、はどのように私は、PostgreSQLがランキングの下にnullを扱うことができますか?

(すなわち、任意の値よりも小さいようNULLSを並べ替える)

私はDENSE_RANKページでこれを気づいたが、それはこの機能については特に話をされていませんが、おそらくそれは、手がかりとなりますか?

注:SQL標準はRESPECTのNULLSを定義したり、リード、ラグ、FIRST_VALUE、LAST_VALUE、およびNTH_VALUEためNULLSオプション を無視します。これはPostgreSQLで実装された ではありません。動作は常に 標準のデフォルトと同じです(RESPECT NULLSと同じです)。同様に、nth_valueの標準の FROM FIRSTまたはFROM LASTオプションは実装されていません。 デフォルトのFROM FIRSTビヘイビアがサポートされています。 (ORDER BY順序付けを逆に行うLAST FROMの 結果を達成することができます。)

答えて

7

NULL値の並べ替え方法を変更するNULLS LAST句を使用します。どこでもORDER BYため、

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

だけではなく、ウィンドウ関数のために:あなたは尋ねまさにありません。

Postgresは正しいものをそのまま使用します。 NULLはソート順が昇順であるため、順序が逆転したときに最初にソートされるはずです。

関連:

+0

素晴らしい - どうもありがとうございました! (私はpostgresqlが正しい方法かもしれないと思った:-)) – kmp

関連する問題