我们说这个简化的表格包含有关人员航班的数据(乘客的身份证和他乘坐的公司的身份证):
+-------------+-----------+
| 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 |
+-------------+-----------+
我想要实现的目标是让所有乘坐超过1家公司的乘客,以及与他们飞过的每家公司有相同航班数量的乘客。
我希望得到这个结果:
+-------------+
| PassengerID |
+-------------+
| 14 |
| 41 |
+-------------+
说明:
好的身份证明:
14 - 飞行3家公司,每次飞行1次
41 - 飞行2家公司,每次飞行2次
BAD ID&#39> s 20 - 飞行3个公司但2个航班与一个公司和1个航班每人 36 - 与一家公司一起飞行
我尝试考虑它,就像我在添加COID的CompanyID时GROUP BY PassengerID和CompanyID所以我会得到这样的结果:
+-------------+-----------+------------------+
| 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再次对它进行分组。
然后我会使用自联接来比较相同乘客中的COUNT,但我坚持使用PassengerID 20的问题,因为自联接会加入这些行:
+-------------+-----------+------------------+
| PassengerID | CompanyID | COUNT(CompanyID) |
+-------------+-----------+------------------+
| 20 | 1 | 1 |
| 20 | 2 | 1 |
+-------------+-----------+------------------+
并将忽略具有相同PassengerID的错误行:
+-------------+-----------+------------------+
| PassengerID | CompanyID | COUNT(CompanyID) |
+-------------+-----------+------------------+
| 20 | 5 | 2 |
+-------------+-----------+------------------+
我还没有尝试执行此查询,只考虑可能的解决方案,因此可能无法正常工作。
答案 0 :(得分: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 :(得分:1)
我选择PassengerID以及公司计数,然后选择与外部选择中的条件对应的组
'00', '000', '0000'