3

特定の方法で頻繁に注文するテーブルがあります。その順序付けは、ランクと呼ばれる派生列の基礎です。テーブル全体にクエリを実行すると、データベースにそのランクを計算させることができます。

CREATE TEMP SEQUENCE the_seq;
SELECT my_table.foo, my_table.bar, nextval('the_seq') AS rank
FROM my_table
ORDER BY my_table.bar DESC;

これにより、次のような有用な結果が得られます。

foo  | bar  | rank
-------------------
0005 | 2100 | 1
0003 | 1632 | 2
0002 | 1200 | 3
0001 | 899  | 4
0004 | 500  | 5

その結果セットを使用して、任意の foo のランクを決定できます。ただし、これには、foo '0001' のランクが必要な場合でも、テーブル全体にクエリを実行し、結果セットを反復処理する必要があります。

理想的には、ランク列を実行するビューがあればいいので、任意に次のように言えます。

SELECT my_table_vw.foo, my_table_vw.bar, my_table_vw.rank
FROM my_table_vw
WHERE my_table_vw.foo = '0001'

そしてただ得る

foo  | bar  | rank
-------------------
0001 | 899  | 4

ただし、ビューはその定義で一時シーケンスを構築できないため、データベースでそれを構築する方法がわかりません。私がやろうとしていることは可能ですか?代替手段、挿入時のランクの維持、またはテーブル全体のクエリがばかげているように見えるため、そうしなければならないと感じています。

4

1 に答える 1

9

シーケンスを使用する代わりに、次を使用しrow_number()ます。

SELECT my_table.foo, my_table.bar, row_number() over (order by my_table.bar desc) as rank
FROM my_table;

これをビューに入れることができます。

于 2013-08-31T16:23:24.207 に答える