2012-02-03 71 views
0

样本数据组:如何找到行,其中每一组中的所有行都有一个特定的列值

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的所有组,另一个查询用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 

编辑:更新了样本数据和查询,以表明我对分组两列,不只是一个。

+0

什么是你当前的查询看起来像工作? – 2012-02-03 16:49:25

回答

5
SELECT ID1, ID2 
FROM MyTable 
GROUP BY ID1, ID2 
HAVING COUNT(Type) = SUM(CASE WHEN Type = 'A' THEN 1 ELSE 0 END) 
+0

+1 - 您的评论是关于我的(删除)答案 – JNK 2012-02-03 16:57:13

+0

谢谢Bassam,但我遇到了运行此查询的麻烦,因为在我的真实数据中ID1不只是一列,所以它抱怨COUNT函数需要1个参数。我会更新我的样本数据。 – khaledh 2012-02-03 17:00:28

+0

@JNK我相信你会在自己的双重身上发现它:D – 2012-02-03 17:00:43

1

有两个备选方案不需要聚集(但需要不同的)

反连接

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

相关问题