2015-06-02 56 views
1

我試圖用HAVING子句編寫以下查詢,以避免編寫一個子查詢,因此使查詢有點少讀:HAVING子句有什麼問題?

SELECT partner_id, player_id, currency_id, platform_id 
FROM account 
GROUP BY partner_id, player_id, currency_id, platform_id 
HAVING MAX(date) = date 

我需要得到所有的行,由我指定的內容分組在GROUP BY子句中有max date。但我得到了關於的錯誤

ERROR: column "account.date" must appear in 
the GROUP BY clause or be used in an aggregate function 

我在聚合函數中使用它。怎麼了?

+0

出了什麼問題'其中,max(日期)= date'?如果你想使用'having',你必須按'having'子句中的列進行分組。 – Smutje

+0

@Smutje聚合是不允許在where子句 – user3663882

+0

你想完成什麼?你想每組有一行(具有最大日期的行)?如果是,開窗功能(如Damien_The_Unbeliever建議的)是要走的路。如果不是,請添加示例輸入和預期輸出到您的問題。 –

回答

5

可以使用window function分配行號(或隊伍中,如果你想採取捆綁最頂層行):

SELECT * FROM (
    SELECT partner_id, player_id, currency_id, platform_id, 
    ROW_NUMBER() OVER (
     PARTITION BY partner_id, player_id, currency_id, platform_id 
     ORDER BY date desc) as rn 
    FROM account 
) as t 
WHERE t.rn = 1 
+0

因此,只有擁有這樣的東西是不可能的,不是嗎? – user3663882

+0

@ user3663882 - no。在每個子句中,同一列表達式必須表示相同的事物。但在你的例子中,你想在等號的左邊,'MAX(日期)'內的'日期'值意味着「所有行的'日期'值」,在等號的右邊,'日期'到意思是「特定行的'日期'值」。 –

+0

好點,現在得到了。謝謝。 – user3663882

0

試試下面的查詢:

SELECT partner_id, player_id, currency_id, platform_id 
FROM account 
GROUP BY date, partner_id, player_id, currency_id, platform_id 
HAVING MAX(date) = date 

在這裏,你忘記子句中組添加日期(列名)。

請讓我知道,這是對你的作品?

+0

錯了,按日期分組沒有得到結果我需要英寸 – user3663882

+0

@ user3663882下面使用分組查詢,如果你給最大日期的多個記錄: '代碼'(SELECT PARTNER_ID,player_id,currency_id,平臺_id FROM帳戶 GROUP BY日期,PARTNER_ID,player_id,currency_id,平臺_id其中date =(SELECT MAX(日期)FROM帳戶) ) –

+0

你確定嗎?因爲將你指定的庫分組給你的結果相當於'SELECT partner_id,player_id,currency_id,platform_id FROM account'。事實上,按所有列進行分組。 – user3663882