6

Postgresql バージョン 9.1.9 を使用しています。

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"

bigintそして、単一のnull許容列(Aと呼ばれる)を持つ単純なテーブル(Testと呼ばれる)があります。テーブルには次のデータがあります。

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 標準では、lead、lag、first_value、last_value、および nth_value に対して RESPECT NULLS または IGNORE NULLS オプションが定義されています。これは PostgreSQL では実装されていません。動作は常に標準のデフォルト、つまり RESPECT NULLS と同じです。同様に、nth_value の標準の FROM FIRST または FROM LAST オプションは実装されていません。デフォルトの FROM FIRST 動作のみがサポートされています。(ORDER BY の順序を逆にすることで、FROM LAST の結果を得ることができます。)

4

1 に答える 1

10

この句を使用して、値のソートNULLS LAST方法を変更し ます。NULLあなたが求めたことを正確に行います:

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

ウィンドウ関数だけでなく、ORDER BY どこでも

Postgres は、最初から正しいことを行います。NULL並べ替えは昇順で最後に行われるため、順序が逆になった場合、既定では最初に並べ替えられます。

関連している:

于 2013-06-18T19:43:10.043 に答える