2017-04-20 118 views
0

我需要查找符合特定條件的任何組的所有行。如何檢查一組行中是否有至少一個特定值

我將組定義爲在「組」列中共享值的多行。
相關組必須包含至少一行且合格設置爲true,並且該組中至少有兩行必須在除組或合格之外的任何列中彼此不同。

示例表

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) 

的問題是,它返回的結果太多,因爲它沒有考慮到是否將該組中的一條記錄標記爲符合條件。

我可能錯過了一些簡單的事情,但我無法弄清楚如何檢查組中的一條記錄是否將合格設置爲true,而不檢查它們是否都設置爲true。

回答

1

添加一個條件來檢查組是否至少有一個符合條件=真值。

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 
    ) 
1

您可以識別使用聚合邏輯組:

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' 
       ); 
相關問題