如何检查一组行中是否至少有一行具有特定值

时间:2017-04-20 18:23:04

标签: sql

我需要查找属于满足特定条件的任何组的所有行。

我将一个组定义为在“组”列中共享值的多个行 相关组必须至少包含一行,且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)

问题在于它返回了太多结果,因为它没有考虑该组中的一个记录是否被标记为合格。

我可能遗漏了一些简单的东西,但是我无法弄清楚如何检查组中的一条记录是否设置为true,而不检查是否所有记录都设置为true。

2 个答案:

答案 0 :(得分:2)

您可以使用聚合逻辑识别组:

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'
                  );

答案 1 :(得分:1)

再添加一个条件,检查该组是否至少有一个符合条件的= 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
    )