[英]Group by non aggregate condition
組中是否可能有非匯總條件? 例如,我們有:
Table1(firstName, lastName, gender)
而且我們按 firstName
然后按lastName
分組,但是我們只希望其中至少有5個男性的組。 另一個例子是沒有男性或類似條件的群體。 實際上,我通過使用case when解決了它,但是我正在尋找是否有直接的解決方案。 此問題的另一種形式是,當我們只希望包含至少一個年齡大於18歲的人的組或類似的問題時。
我不知道這是否類似於您的“用例解決方案”,但我認為這是最簡單的方法。
基本上,不只是計算,還可以求和與條件匹配的行數的總和,因此模式始終為: SUM(CASE WHEN <condition> THEN 1 [ELSE 0] END
。在HAVING
子句中,可以按以下方式過濾聚合。
由於count
不計算null
,因此您也可以將其寫為COUNT(CASE WHEN <condition> THEN 1 [ELSE null] END)
。 可以說這種方法比SUM
方法更清晰,但我更習慣那種方法。
SELECT
FirstName, LastName
FROM
Table1
GROUP BY
FirstName, LastName
HAVING
SUM(CASE WHEN Gender = 'M' THEN 1 ELSE 0 END) >= 5
以上條件適用於“至少5名男性”。
要寫“精確的3女人和至少一個18歲以上的人”,您可以這樣做:
HAVING
SUM(CASE WHEN Gender = 'F' THEN 1 ELSE 0 END) = 3
SUM(CASE WHEN Age > 18 THEN 1 ELSE 0 END) >= 1
這些條件是分開工作的,因此在上述條件下,這個18歲的人可能是三個女人之一或一個男人。 但是您也可以結合案例中的條件。 例如:“至少5位18歲或以上的男人”:
HAVING
SUM(CASE WHEN Gender = 'M' AND Age >= 18 THEN 1 ELSE 0 END) >= 5
我希望這些示例可以幫助您找到所需的條件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.