2012-10-26 41 views
3

在Postgresql 8.2中,我想按順序編號行。我有表tSQL Fiddle不帶窗口函數的行編號

c 
    --- 
    3 
    2 

我想這一點:

c | i 
    ---+--- 
    2 | 1 
    3 | 2 

我嘗試這樣做:

select * 
from 
    (select c from t order by c) s 
    cross join 
    generate_series(1, 2) i 

,並得到:

c | i 
    ---+--- 
    2 | 1 
    3 | 1 
    2 | 2 
    3 | 2 
+2

8.2長時間不支持。您現在應該升級*** *** –

+1

@a_horse_with_no_name客戶端只想快速解決單個問題。傳福音的機會不多。 –

+1

客戶還是應該考慮儘快升級*。 –

回答

3

唯一我可以瘦k是一個序列。你可以做這樣的事情:

drop sequence if exists row_numbers; 
create temporary sequence row_numbers; 

select next_val('row_numbers'), dt.c 
from (select c from t order by c) as dt; 

我扔了drop sequence row_numbers作爲很好,但如果你忘了temporary應注意這一點。

這有點麻煩,但你可能會把它包裝在一個函數中來掩蓋一些醜陋。

請記住,不再支持8.2,但8.4和8.4具有窗口功能。


參考(8.2版本):

2

您可以使用 「三角連接」,如下:

select a.c, (select count(*) from t where c <= a.c) as i 
from t as a 
order by i 

但是,這裏假定c的值是唯一的,因爲「行編號」方案只是小於或等於當前行的行數。必要時,可以擴展此功能以包含主鍵或其他用於打破平局的獨特列。

另外,可以有一些performance implications以這種方式加入。

+0

+1'c'不是唯一的,我可以使用第二行。性能不是問題,因爲它是一次性操作。但我更喜歡順序解決方案,因爲這是我在發佈之前計劃的內容,而且我已經把它放在了腦海裏(這比我的例子要複雜得多)。 –