0

8.3 の問題はrank()、8.4 で導入されたことです。

数字 [10,6,6,2] を考えてみましょう。
ランクが行番号と等しい数値のランクを達成したいと思います。

rank | score
-----+------
1    | 10
2    | 6
3    | 6
4    | 2

部分的な解決策は、スコアが高いか等しいアイテムを自己結合してカウントすることです。これにより、次が生成されます。

1    | 10
3    | 6
3    | 6
4    | 2

しかし、それは私が望むものではありません。
ランク付けする方法、または何らかの方法でスコアで並べ替えてから、その行番号を抽出する方法はありますか?

4

3 に答える 3

2

ウィンドウ関数と同等の行番号が必要な場合は、バージョン 8.3 (または任意のバージョン) で (temporary) を使用して即興で作成できます。row_number()SEQUENCE

CREATE TEMP SEQUENCE foo;
    
SELECT nextval('foo') AS rn, *
FROM   (SELECT score FROM tbl ORDER BY score DESC) s;

ここでdb<>fiddle
古いsqlfiddle

サブクエリは、 を呼び出す 前にnextval()行を並べ替えるために必要です。

シーケンス(一時オブジェクトと同様)に注意してください...

  • 作成された同じセッションでのみ表示されます。
  • 同じ名前の他のテーブル オブジェクトを非表示にします。
  • セッションの最後に自動的に削除されます。

同じセッションでシーケンスを使用するには、各クエリの前に繰り返し実行します。

SELECT setval('foo', 1, FALSE);
于 2013-01-25T16:57:59.217 に答える
1

PG 8.3 で動作する配列を使用する方法があります。パフォーマンスに関しては、おそらくあまり効率的ではありませんが、多くの値がなければ問題ありません。

アイデアは、一時配列内の値をソートし、配列の境界を抽出し、それを結合してgenerate_series値を 1 つずつ抽出することです。配列のインデックスは行番号です。

テーブルが であると仮定したサンプル クエリscores(value int):

SELECT i AS row_number,arr[i] AS score
 FROM (SELECT arr,generate_series(1,nb) AS i
   FROM (SELECT arr,array_upper(arr,1) AS nb
     FROM (SELECT array(SELECT value FROM scores ORDER BY value DESC) AS arr
     ) AS s2
   ) AS s1
 ) AS s0
于 2013-01-25T15:38:58.697 に答える
0

このテーブルの PK はありますか?

自己参加して、より高いか等しいスコアとより高い PKを持つアイテムをカウントするだけです。

PK 比較は同点を解消し、望ましい結果をもたらします。

9.1 にアップグレードした後は、row_number().

于 2013-01-25T14:04:12.187 に答える