SQL - 在列中查找具有特定值组合的行

Posted

技术标签:

【中文标题】SQL - 在列中查找具有特定值组合的行【英文标题】:SQL - Finding rows with specific combination of values in a column 【发布时间】:2019-08-30 09:32:34 【问题描述】:

不知道如何准确地表达这个问题,最好用一个例子来理解。我试过在 SO 上环顾四周,但找不到我要找的东西。抱歉,如果存在的话,我很乐意关闭它。

使用 SQL 数据库,我的数据如下所示:

col1 | col2
------------
A    |   11
A    |   56
A    |   59
B    |   56
C    |   59
C    |   56

我想找到 col1 的值,在 col2 中,值是 56 和 59,但不是 11。所以对上面示例表的查询将只返回“C”。

我已经尝试过窗口化和子查询,如果感觉它不应该太难,但不是很成功。任何提示表示赞赏,谢谢!

【问题讨论】:

“56 和 59 但不是 11。”,你想要 A?我会说 C. 如果 D 有 56、59 和 64 怎么办?应该退货吗? @jarlh 你是对的,抱歉打错了,我的意思是'C'不知道为什么'A'出来了!我已经编辑了问题 【参考方案1】:

为此我喜欢group byhaving

select col1
from t
group by col1
having sum(case when col2 = 56 then 1 else 0 end) > 0 and
       sum(case when col2 = 59 then 1 else 0 end) > 0 and
       sum(case when col2 = 11 then 1 else 0 end) = 0 ;

sum() 计算每个特定值。那么> 0 表示col1 值至少存在一行,= 0 表示不存在。

注意:这是基于您对问题的描述。这将返回'C',而不是'A',这与描述一致。

【讨论】:

【参考方案2】:

在执行GROUP BY 时,使用WHERE 子句仅包含这三个值。使用 HAVING 子句检查 56 是否为 min() 值,即不存在值 11。还要检查 59 是否是 max() 值,以确保 56 和 59 都存在。

select col1
from t
where col2 in (11, 56, 59)
group by col1
having min(col2) = 56 and max(col2) = 59

【讨论】:

【参考方案3】:

据我了解您的问题,这应该可行:

select a.col1 
from t as a 
where 
  a.col1 = 56   
  and not exists(select 1 from t as b 
    where b.col1 = a.col1
      and b.col1 = 11
 )
 and exists(select 1 from t as c 
    where c.col1 = a.col1
      and c.col1 = 59
 )
 group by a.col1 -- maybe you need to eliminate duplicates

为了获得更好的答案,您可以提供有关分布的更多详细信息:

col1 和 col2 的组合是唯一的。 表中只有这 3 个不同的值。

【讨论】:

以上是关于SQL - 在列中查找具有特定值组合的行的主要内容,如果未能解决你的问题,请参考以下文章

在列中查找字母并提取包含特定字母的行

pandas中的SQL查询:根据其他列的组合在列中连接多行

在列中查找值,填充'直到非空白单元格

是否有可以在列中查找非整数的 sql 条件?

在列中查找最小值

SQL中PIVOT 行列转换