2017-05-05 1 views
-1

Je voudrais faire correspondre toutes les entrées dans une table de journaux qui se produit ayant les mêmes day et cause qui sont dans la table plus d'une fois. J'ai écrit la requête pour que récupère déjà les doublons, mon problème est que j'ai besoin d'avoir accès à toutes les colonnes dans le résultat de la table pour JOINs plus tard. Le tableau ressemble à ça:Auto-jointure pour trouver des doublons mais en incluant toutes les colonnes

| ID | DATE  | CAUSE | USER | ... | 
|--------------------------------------| 
| x | 2017-01-01 | aaa | 100 | ... | 
| x | 2017-01-02 | aaa | 101 | ... | 
| x | 2017-01-03 | bbb | 101 | ... | 
| x | 2017-01-03 | bbb | 101 | ... | 
| x | 2017-01-04 | ccc | 101 | ... | 
| x | 2017-01-04 | ccc | 101 | ... | 
| x | 2017-01-04 | ccc | 101 | ... | 
| x | 2017-01-05 | aaa | 101 | ... | 
| .....................................| 
| .....................................| 
| .....................................| 

Requête:

SELECT logs.* FROM 
    (SELECT day, cause FROM logs 
     GROUP BY day, cause HAVING COUNT(*) > 1) AS logsTwice, logs 
WHERE logsTwice.day = logs.day AND logsTwice.cause = logs.cause 

Les sous sélectionner fetch exactement les bonnes données (date et la cause), mais lorsque je tente d'obtenir les colonnes supplémentaires de ces matchs-je obtenir complètement faux Les données. Qu'est-ce que je fais mal?

+0

Mis à part le fait que la syntaxe de jointure est sérieusement obsolète, il semble que cela devrait fonctionner. Compte tenu de cet ensemble de données, qu'est-ce que vous récupérez? – Simon

+0

Veuillez lire et agir sur [mcve]. En particulier, afficher DDL, DML, entrée, sortie et sortie attendue. – philipxy

Répondre

0

Vous pouvez simplement utiliser les fonctions de la fenêtre:

SELECT l.* 
FROM (SELECT l.*, 
      COUNT(*) OVER (PARTITION BY day, cause) as cnt 
     FROM logs l 
    ) l 
WHERE cnt > 1; 

En général, les fonctions de fenêtre auront de meilleures performances que la requête équivalente à l'aide JOIN et GROUP BY.

0

Essayez ceci:

SELECT logs.* FROM logs 
inner join 
(SELECT day, cause FROM logs GROUP BY day, cause HAVING COUNT(*) > 1) logsTwice 
on logsTwice.day = logs.day AND logsTwice.cause = logs.cause