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

num*_*oth 12 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
Run Code Online (Sandbox Code Playgroud)

期望的结果

Group    LastName    FirstName   Eligible
==========================================
 2       Doe         Beth          True
 2       Doe         Jane          False
 2       Doe         Jane          False
 4       Adams       Sally         True
 4       Grimes      Sally         True
Run Code Online (Sandbox Code Playgroud)

以下查询让我接近

SELECT *
FROM ExampleTable
WHERE Group in 
    (SELECT Group
    FROM ExampleTable
    GROUP BY Group
    HAVING count(distinct LastName) > 1 or count(distinct FirstName) > 1)
Run Code Online (Sandbox Code Playgroud)

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

我可能错过了一些简单的事情,但我无法弄清楚如何检查组中的一条记录是否已将 Eligible 设置为 true,而不检查所有记录是否都设置为 true。

Vam*_*ala 11

添加一个条件来检查该组是否至少有一个符合条件的=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
    )
Run Code Online (Sandbox Code Playgroud)


Gor*_*off 6

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

SELECT Group
FROM ExampleTable
GROUP BY Group
HAVING (count(distinct LastName) > 1 or count(distinct FirstName) > 1)) AND
       MAX(eligible) = 'True';
Run Code Online (Sandbox Code Playgroud)

注意:这假设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'
                  );
Run Code Online (Sandbox Code Playgroud)