2011-11-04 7 views
0

Je voudrais identifier les occurrences où il y a plus d'une valeur distincte d'une combinaison de colonnes E, F dans un groupement A, B, C, D.Distinct E, F dans un regroupement A, B, C, D?

Par exemple, étant donné les données suivantes:

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 

Je veux retourner

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

..car il ar plusieurs distincts (E, F) des combinaisons dans ce (A, B, C, D) groupement).

Voici le SQL pour créer votre cas de test!

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   ' 

Répondre

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 

Edit: mauvaise fonction de fenêtrage utilisé

Edit 2: plus claire maintenant des échantillons de données

+0

Désolé: Êtes-vous sûr? Les résultats ne semblent pas corrects. – ChadD

+0

@Velika: J'ai écrit ceci 30 minutes avant vos données d'échantillon. Je devinais essentiellement. Mais je vois mon erreur maintenant – gbn

+0

Je pense que nos deux réponses sont toujours fausses. Ils retournent tous deux 2 rangées au lieu d'1 rangée. J'ai ajouté les informations supplémentaires pour aider les gens à m'aider :-) – 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 

Ou

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 
Questions connexes