2017-09-29 2 views
1

Disons que j'ai ce tableau simplifié contenant des données sur les vols de personnes (ID du passager et l'ID de la compagnie, il a volé avec):La comparaison d'un ensemble de valeurs groupées pour se

+-------------+-----------+ 
| PassengerID | CompanyID | 
+-------------+-----------+ 
|   14 |   1 | 
|   14 |   3 | 
|   14 |   4 | 
|   20 |   1 | 
|   20 |   2 | 
|   20 |   5 | 
|   20 |   5 | 
|   36 |   5 | 
|   36 |   5 | 
|   36 |   5 | 
|   41 |   1 | 
|   41 |   1 | 
|   41 |   2 | 
|   41 |   2 | 
+-------------+-----------+ 

Ce que je suis en train de atteindre est d'obtenir tous les passagers qui ont volé avec plus d'une compagnie et qui ont eu le même nombre de vols avec chaque compagnie avec laquelle ils ont volé.

Je vous attendre à obtenir ce résultat:

+-------------+ 
| PassengerID | 
+-------------+ 
|   14 | 
|   41 | 
+-------------+ 

Explication:
BONNE ID:
14 - vola avec 3 entreprises, 1 vol avec chaque
41 - vola avec 2 entreprises, 2 vols avec chaque

est mauvais d'ID:
20 - ont volé avec 3 entreprises mais 2 vols avec une compagnie et 1 vol par d'autres
36 - a volé avec seulement 1 entreprise

J'ai essayé de penser comme je GROUP BY PassengerID et CompanyID tout en ajoutant COUNT CompanyID donc je vais obtenir quelque chose comme ceci:

+-------------+-----------+------------------+ 
| PassengerID | CompanyID | COUNT(CompanyID) | 
+-------------+-----------+------------------+ 
|   14 |   1 |    1 | 
|   14 |   3 |    1 | 
|   14 |   4 |    1 | 
|   20 |   1 |    1 | 
|   20 |   2 |    1 | 
|   20 |   5 |    2 | 
|   36 |   5 |    3 | 
|   41 |   1 |    2 | 
|   41 |   2 |    2 | 
+-------------+-----------+------------------+ 

J'avais idée d'utiliser HAVING COUNT (PassengerID)> 1 pour se débarrasser de l'ID 36 mais pour cela je devrais le regrouper à nouveau par PassengerID.

Je voudrais utiliser un autojointure pour comparer COUNT dans les mêmes passagers mais je coincé sur un problème PassengerID 20 parce que autojointure se joindra à ces lignes:

+-------------+-----------+------------------+ 
| PassengerID | CompanyID | COUNT(CompanyID) | 
+-------------+-----------+------------------+ 
|   20 |   1 |    1 | 
|   20 |   2 |    1 | 
+-------------+-----------+------------------+ 

et ignorera la mauvaise ligne avec la même PassengerID:

+-------------+-----------+------------------+ 
| PassengerID | CompanyID | COUNT(CompanyID) | 
+-------------+-----------+------------------+ 
|   20 |   5 |    2 | 
+-------------+-----------+------------------+ 

Je n'ai pas essayé d'exécuter cette requête, en pensant à la solution possible donc il ne peut pas fonctionner de cette façon.

Répondre

1

Vous deux niveaux d'agrégation:

select PassengerID 
from (select PassengerID, CompanyID, count(*) as numflights 
     from flights f 
     group by PassengerID, CompanyID 
    ) f 
group by PassengerID 
having count(*) > 1 and      -- more than one flight 
     min(numflights) = max(numflights); -- all the same number 
1

je sélectionne les PassengerIDs ainsi que les comptes de l'entreprise, puis sélectionnez les groupes correspondant aux critères dans une enveloppe extérieure sélectionnez

select PassengerID 
from (
select PassengerID, count(*) as c 
from yourtable 
group by PassengerID, CompanyID) t 
group by PassengerID 
having min(c) = max(c) and count(*) > 1