2017-04-20 94 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' 
       ); 
相关问题