Различаются E, F в группе A, B, C, D? - PullRequest
0 голосов
/ 04 ноября 2011

Я хотел бы определить случаи, когда в группе A, B, C, D имеется более 1 отдельного значения комбинации столбцов 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         

.. потому что в этой (A, B, C, D) есть несколько различных (E, F) комбинаций).

Вот 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 ]

2 голосов
/ 04 ноября 2011
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: теперь понятнее с примерами данных

1 голос
/ 04 ноября 2011
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  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...