2013-08-31 43 views
1

我有一張表,我經常以某種方式訂購。該排序是我們可以稱之爲rank的派生列的基礎。如果我查詢整個表,我可以讓數據庫計算出排名對我來說:postgres視圖中的臨時序列

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 

但是我不知道如何構建在數據庫中,因爲視圖不能在其定義中構造臨時序列。我正在努力做甚麼?我覺得必須這樣做,因爲替代方案在插入或查詢整個桌面時保持排名似乎很可笑。

回答

5

而不是使用一個序列,使用row_number()

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

你可以把它放到視圖。

+0

完美的上帝。感謝您的即時響應! – Karl