如何检查一组行中是否有至少一个特定值
问题描述:
我需要查找符合特定条件的任何组的所有行。如何检查一组行中是否有至少一个特定值
我将组定义为在“组”列中共享值的多行。
相关组必须包含至少一行且合格设置为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。
答
添加一个条件来检查组是否至少有一个符合条件=真值。
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
)
答
您可以识别使用聚合逻辑组:
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'
);