2016-01-06 48 views
0

我想建立一個查詢,它給了我一些用戶最大的金額總和。我可以通過limit 1獲得最大值。但是,如果可能有多個用戶具有相同的最大值,我該如何實現?如何獲得多個相同的最大值

例如,我有表作爲ID, CONTACT_ID, ..., AMOUNT, ....

目前我使用這種查詢:

SELECT SUM(AMOUNT) AS total,CONTACT_ID 
    FROM TABLE 
    WHERE ID = 1 
    GROUP BY CONTACT_ID  
    ORDER BY total DESC limit 1 

如果我嘗試使用MAX()函數。它給我所有的行而不是最大值。

SELECT total,CONTACT_ID FROM 
(SELECT SUM(AMOUNT) AS total,CONTACT_ID 
    FROM TABLE 
    WHERE ID = 1 
    GROUP BY CONTACT_ID  
    ORDER BY total DESC) 
GROUP BY CONTACT_ID 
HAVING total = MAX(total) 

回答

2

HAVING在聚合完成後生效。所以每組中的MAX(total)行已經被選中,這意味着只剩下total的值的最大值。

你需要做這兩個步驟:首先確定最大總,然後讓所有的行與價值:

SELECT total, CONTACT_ID 
FROM (SELECT SUM(AMOUNT) AS total, CONTACT_ID 
     FROM MyTable 
     WHERE ID = 1 
     GROUP BY CONTACT_ID) 
WHERE total = (SELECT SUM(AMOUNT) 
       FROM MyTable 
       WHERE ID = 1 
       GROUP BY CONTACT_ID 
       ORDER BY 1 DESC 
       LIMIT 1); 
+0

實際上'ID = 1'也來自一個大的子查詢。那麼有什麼辦法可以分兩步來避免它? – kirtan403

+0

僅適用於所有Android版本或視圖不支持的[公用表表達式](http://www.sqlite.org/lang_with.html)。 –

+0

所以我需要複製整個部分是唯一的解決方案? – kirtan403

-1

乍一看,我會使用一個二次請求如:

SELECT SUM(AMOUNT) AS total,CONTACT_ID 
    FROM TABLE 
    WHERE ID = 1 
    AND total=(SELECT MAX(SUM(AMOUNT)) FROM TABLE GROUP BY CONTACT_ID) 
    GROUP BY CONTACT_ID  
    ORDER BY total DESC 

諾塔:該WHERE ID = 1;來自您的第一個請求

+0

'CONTACT_ID AS total'是錯誤的。 –

+0

感謝您的糾正,我錯過了正確的AS語法。 –