2015-12-14 145 views
2

我有一個PostgreSQL的表看起來像:SQL:多重嵌套聚合函數

artists | songs 
=================== 
artist1 | song a 
artist1 | song b 
artist2 | song c 

,我想作一個選擇語句,讓我對每一位藝術家曲目的數量和數量之間的差異他的曲目和藝術家的最跟蹤

所以在這種情況下,數字

artist | number songs | difference 
==================================== 
artist1 | 2   | 0 
artist2 | 1   | 1 

我遇到的問題是,我使用count(songs)的日e的歌曲數量也max(count(songs))(需要計算差異)在相同的結果和使用這兩個給我的問題嵌套聚合函數。

回答

2

可以使用的聚合函數的組合(以計數的每個藝術家的歌曲數量)和窗口功能,產生這樣的結果:

SELECT artist, 
     COUNT(*) AS num_songs, 
     MAX(COUNT(*)) OVER (ORDER BY COUNT(*) DESC) - COUNT(*) AS diff 
FROM  artists              
GROUP BY artist; 

這是一點點笨拙,但母鹿的伎倆。

編輯:
如@a_horse_with_no_name評論的,所述over子句中的order by子句是多餘的。刪除它肯定會使代碼更易於閱讀:

SELECT artist, 
     COUNT(*) AS num_songs, 
     MAX(COUNT(*)) OVER() - COUNT(*) AS diff 
FROM  artists              
GROUP BY artist; 
+0

'over()'子句中的'by by'並不是真的必要的。 –

+0

@a_horse_with_no_name呵呵!從來不知道有一個空的'over'子句甚至是可能的,但是在你的評論之後我玩了一下它,它絕對有效(並且看起來更清晰)。今天學到一些東西,謝謝! (也編輯到我的答案中) – Mureinik