【问题标题】:In standard SQL, how do I select rows such that for each unique value in one column, all of the values in another column are a specified value?在标准 SQL 中,如何选择行,以便对于一列中的每个唯一值,另一列中的所有值都是指定值?
【发布时间】:2014-09-06 03:26:42
【问题描述】:

在标准 SQL 中,如何选择行,以便对于一列中的每个唯一值,另一列中的所有值都是指定值?

例如,在下表中,我想选择列 c_1 的所有值,其中 c_s 的值对于 c_1 的每个不同值都是“d”。所以对于 c_1 = '2',c_s 的所有值都是 'd'。 c_1 = '3' 相同。但是,c_1 = '1'、'4' 或 '5' 的情况并非如此。

这是我的桌子:

 id | c_1 | c_2 | c_s
----+------+---------+--------
 1  | 1    | 1       | d
 2  | 1    | 2       |
 3  | 2    | 1       | d
 4  | 2    | 2       | d
 5  | 2    | 3       | d
 6  | 3    | 1       | d
 7  | 4    | 1       | r
 8  | 5    | 1       | d
 9  | 5    | 2       | r

这是我想从我的 sql 查询中返回的内容:

 c_1 | c_2 | c_s
----+---+--------
 2    | 1       | d
 3    | 1       | d

(我不知道如何表达这个问题 - 关键词等 - 如果有更好的措辞可以导致已在此处发布的解决方案,请原谅。)

【问题讨论】:

    标签: sql


    【解决方案1】:

    您可以使用GROUP BYHAVING 做到这一点:

    SELECT c_1
         , MIN(c_2) AS c_2
         , MAX(c_s) AS c_s
    FROM Table1
    GROUP BY c_1
    HAVING MIN(CASE WHEN c_s = 'd' THEN 1 ELSE 0 END) 
          + MAX(CASE WHEN c_s = 'd' THEN 1 ELSE 0 END) = 2
    

    演示:SQL Fiddle

    在您的示例输出中,您为 c_2 选择了 1,即使存在其他值,所以我使用了 MIN(),但如果您想要选择不同的值,可以调整逻辑。

    【讨论】:

    • 或者把这个有子句改为:HAVING MIN(c_s) = MAX(c_s) and c_s = 'd'
    • 谢谢!我想通了。这是我使用的WITH newtable AS (SELECT c_1, COUNT(DISTINCT(c_s)) AS cds, COUNT(c_s) as cs, MIN(c_s) as fs FROM test1 GROUP BY c_1 ORDER BY c_1) SELECT * FROM newtable WHERE cds=1 AND fs='d'。您的解决方案也有效,所以我接受您的解决方案。
    • @jmarkmurphy 取决于缺失值是 NULL 还是空白,NULL 会被聚合忽略并导致该逻辑失败,但如果它是空白的,虽然你' d 需要最后一个是MAX(c_s) = 'd' 而不仅仅是c_s = 'd',因为它在HAVING 子句中。
    【解决方案2】:

    我的答案与山羊 CO 的答案非常相似。我检查每个值的计数并将其与 D 的数量进行比较。

    SQL Fiddle Demo

    select 
      c_1      as 'c_1',
      min(c_2) as 'c_2',
      min(c_s) as 'c_s'
    from yourTable
    group by c_1
    having count(1) = sum(case when c_s = 'd' then 1 else 0 end)
    

    【讨论】:

      猜你喜欢
      • 2021-10-17
      • 1970-01-01
      • 1970-01-01
      • 2018-08-05
      • 1970-01-01
      • 1970-01-01
      • 2023-02-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多