2011-11-04 65 views
0

我想确定在A,B,C,D分组内有多于1个不同的E,F列组合值的情况。A,B,C,D分组内的不同的E,F?

例如,给定以下数据:

SELECT * FROM MyTable 

A   B   C   D   E   F 
---------- ---------- ---------- ---------- ---------- ---------- 
1   1   1   1   A   B   
1   1   1   1   A   B   
1   1   1   2   A   C   
1   1   1   2   A   D 

我想返回

A   B   C   D   
---------- ---------- ---------- ----------  
1   1   1   2   

..because有AR多个不同的(E,F)的组合为(A内,B, C,D)分组)。

这是SQL创建测试用例!

CREATE TABLE [dbo].[MyTable](
    [A] [nchar](10) NULL, 
    [B] [nchar](10) NULL, 
    [C] [nchar](10) NULL, 
    [D] [nchar](10) NULL, 
    [E] [nchar](10) NULL, 
    [F] [nchar](10) NULL 
) ON [PRIMARY] 

GO 
INSERT INTO [dbo].[MyTable]([A], [B], [C], [D], [E], [F]) 
SELECT N'1   ', N'1   ', N'1   ', N'1   ', N'A   ', N'B   ' UNION ALL 
SELECT N'1   ', N'1   ', N'1   ', N'1   ', N'A   ', N'B   ' UNION ALL 
SELECT N'1   ', N'1   ', N'1   ', N'2   ', N'A   ', N'C   ' UNION ALL 
SELECT N'1   ', N'1   ', N'1   ', N'2   ', N'A   ', N'D   ' 

回答

2
SELECT 
    A,B,C,D 
FROM 
    (
    SELECT 
     A,B,C,D, 
     ROW_NUMBER() OVER (PARTITION BY A,B,C,D,E,F ORDER BY (SELECT 1)) AS DistinctTuplesLong, 
     ROW_NUMBER() OVER (PARTITION BY A,B,C,D ORDER BY (SELECT 1)) AS DistinctTuples 
    FROM 
     Mytable 
    ) T 
WHERE 
    DistinctTuplesLong < DistinctTuples 

编辑:使用了错误的窗函数

编辑2:现在更清晰样本数据

+0

对不起:你确定吗?结果看起来不正确。 – ChadD

+0

@Velika:我在你的样本数据前30分钟写了这篇文章。我基本上猜到了。但我现在看到我的错误 – gbn

+0

我认为我们的答案都是错误的。他们都返回2行而不是1行。我添加了额外的信息来帮助人们帮助我:-) – ChadD

1
SELECT A,B,C,D 
FROM [dbo].[MyTable] 
GROUP BY A,B,C,D 
HAVING COUNT(DISTINCT E) > 1 OR COUNT(DISTINCT F) > 1 

或者

WITH T 
    AS (SELECT *, 
       DENSE_RANK() OVER (PARTITION BY A, B, C, D ORDER BY E, F) Rnk 
     FROM [dbo].[MyTable]) 
SELECT DISTINCT A, 
       B, 
       C, 
       D 
FROM T 
WHERE Rnk = 2 
相关问题