2017-04-20 4 views
0

特定の条件を満たすグループの一部であるすべての行を見つける必要があります。行のグループの少なくとも1つに特定の値があるかどうかを確認する方法

私はグループをグループ列の値を共有するいくつかの行として定義しています。
関連グループには、Eligibleがtrueに設定された少なくとも1つの行が含まれていなければならず、グループ内の行のうち少なくとも2つは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) 

問題は、それは考慮していないので、それはあまりにも多くの結果を返すということですグループ内のレコードの1つが適格とマークされているかどうか。

私はおそらく単純なものがありませんが、グループ内のレコードがすべて適格に設定されているかどうかをチェックする方法を見つけることができません。

答えて

1

グループに少なくとも1つの適格な= 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' 
       ); 
関連する問題