2017-09-29 23 views
1

比較比方說,我有一個包含關於人的飛行數據這個簡化表(該公司的客運和ID的ID,他與飛):一組分組值本身

+-------------+-----------+ 
| 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 | 
+-------------+-----------+ 

什麼我想實現目標是讓所有搭乘一家以上公司的乘客以及與他們搭乘的每家公司的航班數量相同。

我希望得到這樣的結果:

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

說明:
GOOD的ID:
14 - 飛行與3家企業,1個航班,每個
41 - 有2家公司,2個航班在飛到每個

BAD的ID:
20 - 飛行與3家公司,但2個航班與一個公司和每個人
次飛行210 36 - 飛到只有1家公司

我試着去想它就像我會GROUP BY PassengerID和CompanyID同時加入CompanyID的COUNT所以我會得到這樣的:

+-------------+-----------+------------------+ 
| 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 | 
+-------------+-----------+------------------+ 

然後,我有想法使用HAVING COUNT(PassengerID)> 1來擺脫ID 36,但爲此我不得不再次通過PassengerID對它進行分組。

然後我會用一個自聯接相同的乘客中比較管用的,但我還是堅持對問題PassengerID 20,因爲自聯接將加入這些行:

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

,而忽略了錯誤的行與同樣PassengerID:

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

我沒有試圖執行這個查詢,只是想着可能的解決方案,因此它可能不會以這種方式工作。

回答

1

你會聚集的兩個層次:

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

我選擇PassengerIDs與公司一起計數,然後在外部選擇對應於標準的羣體選擇

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