2017-10-13 29 views
0

Quelqu'un at-il des idées sur la façon dont je peux mieux écrire ce morceau de code?Meilleur moyen d'écrire ceci: SELECT * avec COUNT> 1

SELECT Column_A, Column_B, Column_C, Column_D, Column_E 
FROM TABLE_A 
WHERE Column_A IN 
(
    SELECT Column_A 
    FROM 
    (
    SELECT Column_A, COUNT(DISTINCT COLUMN_B) AS Column_B_Count 
    FROM TABLE_A 
    GROUP by Column_A 
    HAVING Column_B_Count > 1 
    ) AS A 
) 
GROUP BY Column_A, Column_B, Column_C, Column_D, Column_E; 

Merci!

+0

Chaque fois que vous sélectionnez 'GROUP BY', chaque colonne que vous sélectionnez signifie vraiment' DISTINCT' à la place, bien qu'à 5 colonnes, elle commence à avoir l'air suspecte. Vous pouvez mettre des fonctions d'agrégat (comme 'COUNT') après la clause' HAVING', ce qui signifie que vous pouvez l'enlever de la liste 'SELECT' et vous débarrasser de la sous-requête du milieu. Autre que cela, nous avons besoin de plus d'informations sur votre table/données. –

Répondre

0
SELECT DISTINCT 
    A.Column_A 
    , A.Column_B 
    , A.Column_C 
    , A.Column_D 
    , A.Column_E 
FROM 
    TABLE_A AS A 
    JOIN 
     (
      SELECT Column_A 
      FROM TABLE_A 
      GROUP by Column_A 
      HAVING COUNT(DISTINCT COLUMN_B) > 1 
     ) AS Column_B_Count 
    ON A.Column_A = Column_B_Count.Column_A 
+1

Techniquement, non, puisque le plus éloigné 'GROUP BY' dans l'original supprimerait tous les doublons (bien qu'à 5 colonnes je suis un peu suspect moi-même). –

+0

Merci d'avoir signalé cela - j'ai ajouté un «DISTINCT». :) –

+1

', COUNT (COLONNE DISTINCT_B) AS Column_B_Count' peut être omis si vous utilisez simplement 'HAVING COUNT (DISTINCT COLUMN_B)> 1' au lieu de faire référence par cet alias de colonne dans la clause' having'. –

0
SELECT Distinct Column_A, 
     Column_B, 
     Column_C, 
     Column_D, 
     Column_E 
FROM TABLE_A 
WHERE Column_A IN 
    (
    SELECT Column_A 
    FROM TABLE_A 
    GROUP by Column_A 
    HAVING COUNT(DISTINCT COLUMN_B) > 1 
    ) 
0

J'utiliser les fonctions de la fenêtre. Je pense que c'est ce que vous voulez:

select . . . 
from (select a.*, 
      min(column_b) over (partition by a) as min_b, 
      max(column_b) over (partition by a) as max_b, 
     from table_a a 
    ) a 
where min_b <> max_b; 

Vous pouvez toujours besoin du select distinct, si cette requête peut renvoyer les doublons.

0
SELECT DISTINCT -- same as the final GROUP BY of original query 
    Column_A, Column_B, Column_C, Column_D, Column_E 
FROM TABLE_A 
    -- 
GROUP BY Column_A, Column_B, Column_C, Column_D, Column_E 
QUALIFY -- emulating DISTINCT > 1, which is not allowed in Windowed Aggregates: 
    MIN(COLUMN_B) OVER (PARTITION BY Column_A) 
<> MAX(COLUMN_B) OVER (PARTITION BY Column_A) 

En fonction des données réelles, à savoir un faible nombre de copies par groupe, il pourrait être plus efficace pour enlever le GROUP BY.