将一组分组值与自身进行比较

时间:2017-09-29 10:10:47

标签: sql group-by

我们说这个简化的表格包含有关人员航班的数据(乘客的身份证和他乘坐的公司的身份证):

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

我还没有尝试执行此查询,只考虑可能的解决方案,因此可能无法正常工作。

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'