【问题标题】:How do I find groups of rows where all rows in each group have a specific column value如何找到每组中的所有行都具有特定列值的行组
【发布时间】:2012-02-26 06:44:34
【问题描述】:

样本数据:

ID1   ID2   Num  Type
---------------------
1     1     1    'A'
1     1     2    'A'
1     2     3    'A'
1     2     4    'A'
2     1     1    'A'
2     2     1    'B'
3     1     1    'A'
3     2     1    'A'

想要的结果:

ID1   ID2
---------
1     1
1     2
3     1
3     2

请注意,我是按 ID1 和 ID2 进行分组,而不是 Num,而且我正在专门寻找 Type = 'A' 的组。我知道通过在同一个表上连接两个查询是可行的:一个查询查找具有不同类型的所有组,另一个查询过滤 Type = 'A' 的行。但我想知道这是否可以以更有效的方式完成。

我使用的是 SQL Server 2008,我当前的查询是:

SELECT ID1, ID2
FROM (
    SELECT ID1, ID2
    FROM T
    GROUP BY ID1, ID2
    HAVING COUNT( DISTINCT Type ) = 1
) AS SingleType
INNER JOIN (
    SELECT ID1, ID2
    FROM T
    WHERE Type = 'A'
    GROUP BY ID1, ID2
) AS TypeA ON
    TypeA.ID1 = SingleType.ID1 AND
    TypeA.ID2 = SingleType.ID2

编辑:更新了示例数据和查询,以表明我正在对两列进行分组,而不仅仅是一列。

【问题讨论】:

  • 您当前的查询是什么样的?

标签: sql sql-server sql-match-all


【解决方案1】:
SELECT ID1, ID2
FROM MyTable
GROUP BY ID1, ID2
HAVING COUNT(Type) = SUM(CASE WHEN Type = 'A' THEN 1 ELSE 0 END)

【讨论】:

  • 感谢 Bassam,但我在运行此查询时遇到了麻烦,因为在我的真实数据中,ID1 不仅仅是一列,因此它抱怨 COUNT 函数需要 1 个参数。我将更新我的示例数据。
  • @JNK 我相信你会自己抓到它的双重拍摄:D
  • @BassamMehanni - 可能,但我认为这个答案是正确的。
  • @khaledh 尝试用 COUNT(Type) 替换 Count(ID1) 它应该实际上是相同的,因为它应该等于行数
  • @BassamMehanni 完美运行!谢谢。
【解决方案2】:

有两种选择不需要聚合(但确实需要不同)

反连接

SELECT DISTINCT t1.ID1, t1.ID2 
FROM
    table  t1
    LEFT JOIN table t2
    ON t1.ID1 = t2.ID1
        and t1.Type <> t2.Type
WHERE
    t1.Type = 'A'
    AND 
    t2.ID1 IS NULL

data.se query Sample for 9132209 (Anti-Join)查看它的工作原理

不存在

SELECT DISTINCT t1.ID1, t1.ID2 
FROM
    table  t1
WHERE
    t1.Type = 'A'
AND
   NOT EXISTS 
      (SELECT 1 
       FROM table t2 
       WHERE t1.ID1 = t2.ID1 AND Type <> 'A')

data.se query Sample for 9132209 Not Exists查看它的工作原理

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 2021-07-07
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    相关资源
    最近更新 更多