2016-03-03 74 views
0

我有一個PostgreSQL表example,有三列:a INT, b INT, c TEXT用MAX值和SUM一起獲取行

對於a的每個值,我想要c的最高值爲b,連同所有b的總和。喜歡的東西(如果有一個ARGMAX功能):

SELECT a, ARGMAX(c for MAX(b)), SUM(b) FROM example GROUP BY a 

我找到了很多解決方案,具有不同的技術來獲得ARGMAX位,但他們都不使用GROUP BY,所以我想知道我們最有效的方法是捕獲SUM(或其他集合函數)。

+0

什麼?請給我們數據廣告預期輸出的樣本! – Yossi

+0

對於a的每個值,我希望具有b的最高值的c以及所有b的總和。我必須回到學校去理解那個.. !!! – user2407394

+1

從表組中選擇a,max(c)(由a劃分),sum(b)over(由a,c劃分)a由 –

回答

2

這可以容易地實現利用窗口函數:

SELECT a, b, c, s 
FROM (
    SELECT a, b, c, 
     ROW_NUMBER() OVER (PARTITION BY a ORDER BY b DESC) AS rn, 
     SUM(b) OVER (PARTITION BY a) AS s 
    FROM example) AS t 
WHERE t.rn = 1 
  • ROW_NUMBER枚舉各a分區中記錄:具有最高b值的記錄被指定爲1的值,下一個記錄的2值等
  • SUM(b) OVER (PARTITION BY a)返回每個a分區內所有b的總和。