![](/img/trans.png)
[英]How to delete the row that has least value in a specific column if group by count of the column is greater than 1
[英]How to check if at least one of a group of rows has a specific value
我需要找到屬於某些條件的任何組的所有行。
我將一個組定義為在“組”列中共享一個值的幾行。
相關組必須包含至少一行且Eligible設置為true的行,並且在Group或Eligible以外的任何列中,組中的至少兩行必須彼此不同。
示例表
Group LastName FirstName Eligible
==========================================
1 Smith John True
1 Smith John False
2 Doe Beth True
2 Doe Jane False
2 Doe Jane False
3 Ward Bill True
4 Adams Sally True
4 Grimes Sally True
所需結果
Group LastName FirstName Eligible
==========================================
2 Doe Beth True
2 Doe Jane False
2 Doe Jane False
4 Adams Sally True
4 Grimes Sally True
以下查詢使我接近
SELECT *
FROM ExampleTable
WHERE Group in
(SELECT Group
FROM ExampleTable
GROUP BY Group
HAVING count(distinct LastName) > 1 or count(distinct FirstName) > 1)
問題在於它返回的結果太多,因為沒有考慮該組中的記錄之一是否被標記為合格。
我可能缺少一些簡單的東西,但我無法弄清楚如何檢查組中的一條記錄是否將Eligible設置為true,而不檢查所有記錄是否都設置為true。
您可以使用聚合邏輯來識別組:
SELECT Group
FROM ExampleTable
GROUP BY Group
HAVING (count(distinct LastName) > 1 or count(distinct FirstName) > 1)) AND
MAX(eligible) = 'True';
注意:這假設eligible
是字符串。 取決於類型和數據庫,關於合格的邏輯可以通過其他方式實現。
然后您的查詢基本上在那里:
SELECT et.*
FROM ExampleTable et
WHERE et.Group IN (SELECT Group
FROM ExampleTable
GROUP BY Group
HAVING (count(distinct LastName) > 1 or count(distinct FirstName) > 1)) AND
MAX(eligible) = 'True'
);
再添加一個條件,該條件將檢查該組是否至少有一個合格=真值。
SELECT *
FROM ExampleTable
WHERE Group in
(SELECT Group
FROM ExampleTable
GROUP BY Group
HAVING (count(distinct LastName) > 1 or count(distinct FirstName) > 1)
and count(case when eligible='True' then 1 end) >= 1
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.