2013-07-25 53 views
1

我使用ROW_NUMBER的最後一行()通過創建降序排列,並檢查確定查詢的最後一排,如果我在位置1檢測一組

row | value 
----+------- 
    3 | false 
    2 | false 
    1 | true 

你有任何想法如何應用相同的技術來確定每個組的最後一行?

預期的結果應該是這樣的:

uid | row | value 
----+-----+------- 
    1 | 3 | false 
    1 | 2 | false 
    1 | 1 | true 
    2 | 4 | false 
    2 | 3 | false 
    2 | 2 | false 
    2 | 1 | true 
    3 | 2 | false 
    3 | 1 | true 

或者你知道有什麼更好的方法來檢測PostgreSQL的最後行?

回答

2

使用PARTITION BY爲您OVER()的一部分:

select uid,something, 
    ROW_NUMBER() OVER (PARTITION BY uid ORDER BY something desc) as row 
from 
    someTable 

PARTITION BY原因的任何窗口你使用(如ROW_NUMBER()),以對定義的每個分區分別操作功能齊全 - 所以ROW_NUMBER重啓次數,MAX會發現分區內的行的最大值等。

+0

就是這樣,謝謝。 – mEan

1

要真正確定最後一行每個組(或整體)沒有額外的subquer y,您可以使用窗口功能lead()。這將爲升序和的沒有價值的例子工作:

SELECT uid, something 
     ,row_number() OVER w AS row 
     ,lead (TRUE, 1, FALSE) OVER w AS value 
FROM tbl 
WINDOW w AS (PARTITION BY uid ORDER BY something DESC) 

lead()具有提供默認情況下,沒有「下」行組中找到了第三個參數的很少使用的功能。通過這種方式,您可以爲具有「下一個」行的行返回一個常量TRUE,並用其他替代FALSE替代。

我也使用WINDOW子句,這只是一個符號方便,所以我不必兩次闡明窗口定義。