27

結果がいくつかの列で並べ替えられている場合、PostgreSQL で行番号を取得する方法は?

例えば

SELECT 30+row_number() AS position, * 
FROM users 
ORDER BY salary DESC 
LIMIT 30 
OFFSET 30

クエリは次のようなリストを返すと思いました:

position | name | salary
31       | Joy  | 4500
32       | Katie| 4000
33       | Frank| 3500

ORDER実際には、句をクエリに複製して機能させる必要があります。

SELECT 30+row_number(ORDER BY salary DESC) AS position, * 
FROM users 
ORDER BY salary DESC 
LIMIT 30 
OFFSET 30

コードを複製する必要なく、順序付けられた番号付きの結果を返す方法は他にありますか?

これは、アプリ自体の変数をインクリメントすることで解決できることはわかっていますが、データベース層でこれを行い、既に番号付けされた結果をアプリに戻したいです...

4

1 に答える 1

37

いいえ -order byウィンドウ関数内とステートメントのorder by句は、select機能的に 2 つの異なるものです。

また、あなたのステートメントは: を生成しますERROR: window function call requires an OVER clause

SELECT 30+row_number(ORDER BY salary DESC) AS position, * FROM users ORDER BY salary DESC LIMIT 30 OFFSET 30

次のようにする必要があります。

SELECT 30+row_number() OVER(ORDER BY salary DESC) AS position, * FROM users ORDER BY salary DESC LIMIT 30 OFFSET 30

給与が一意でない場合、同じ注文が生成されるという保証さえないことに注意してください。おそらく、次のようにする方が良いでしょう:

SELECT * 
FROM ( SELECT 30+row_number() OVER(ORDER BY salary DESC) AS position, * 
       FROM users )
ORDER BY position LIMIT 30 OFFSET 30

また、このクエリを異なるオフセットで数回実行する場合は、次のことを行う必要があることに注意してください。

  1. 分離レベルをシリアライズ可能に設定します
  2. あなたが注文しているものは何でもユニークであることを確認してください

または、重複して行が欠落する可能性があります。理由については、この回答のコメントを参照してください。

于 2011-04-04T11:19:31.150 に答える