有人可以解释为什么这两个结果在此简单的SQL查询中有所不同吗?

时间:2019-01-14 12:53:37

标签: sql sqlite

我正在重新学习SQL,目前正在关注此dataquest guide。该数据集来自自行车共享服务Hubway,我想回答这个问题:哪个车站最常用于往返?

此问题涉及两个表:

电台

stations table

Trips

trips table

这是指南中建议的答案:

SELECT stations.station AS "Station", COUNT(*) AS "Count"
FROM trips 
INNER JOIN stations
ON trips.start_station = stations.id
WHERE trips.start_station = trips.end_station
GROUP BY stations.station
ORDER BY COUNT(*) DESC
LIMIT 5;

以及相应的输出:

Guide's result

这是我的答案:

Select stations.station,Count(*) AS "Count"
FROM trips
INNER JOIN stations
ON stations.id = trips.start_station
WHERE trips.start_station = trips.end_station
GROUP BY trips.start_station
ORDER BY "Count" DESC
LIMIT 5

以及相应的输出:

My output

我的答案省略了指南的答案返回的两行。我想了解为什么会这样,因为我无法弄清楚。

1 个答案:

答案 0 :(得分:1)

您在外键(数字start_station列)上的查询组:

GROUP BY trips.start_station

但原始分组在电台名称上

GROUP BY stations.station

如果站点ID和站点名称之间存在一对一的映射,那就很好了。但是,这里不是这种情况。

在数据库中,两次列出了您丢失的两行,它们的名称相同,但工作站ID不同。按电台名称分组可为您提供这些名称的总计数。

事实上,有5个这样的电台。您可以使用GROUP BYHAVING来查询所有此类电台(可以像COUNT一样过滤汇总结果,就像WHERE可以过滤行一样):

SELECT station, COUNT(id)
FROM stations
GROUP BY station
HAVING COUNT(id) > 1
ORDER BY COUNT(id), station

因此,上面显示了所有出现至少两次的电台名称,以及产生以下结果的Hubway数据集:

Andrew Station - Dorchester Ave at Humboldt Pl     2
Boylston at Fairfield                              2
Charles Circle - Charles St. at Cambridge St.      2
Dudley Square                                      2
Mayor Thomas M. Menino - Government Center         2

当我们不通过行数限制查询而仅对重复的站点名称进行筛选时,我们可以获取这5个站点的回程计数。我已经添加了电台ID:

Select stations.station, stations.id, Count(*) AS "Count"
FROM trips
INNER JOIN stations
ON stations.id = trips.start_station
WHERE trips.start_station = trips.end_station
AND stations.station in (
    SELECT stations.station
    FROM stations
    GROUP BY stations.station
    HAVING COUNT(stations.id) > 1
)
GROUP BY trips.start_station
ORDER BY "Count" DESC

那么你就得到

Charles Circle - Charles St. at Cambridge St.     60   1410
Charles Circle - Charles St. at Cambridge St.    113   1329
Mayor Thomas M. Menino - Government Center        23    610
Boylston at Fairfield                            103    458
Boylston at Fairfield                             61    420
Mayor Thomas M. Menino - Government Center        99    380
Dudley Square                                     56    203
Andrew Station - Dorchester Ave at Humboldt Pl   104     70
Dudley Square                                    100     57
Andrew Station - Dorchester Ave at Humboldt Pl    85     29

对于 Charles Circle 站,1410 + 1329产生2739,但是仅记录stations.id=60 Charles Circle 站回程次数太少出现在您的前5个查询中。

现在,为什么该数据库对多个具有相同名称的电台具有多个ID,在该文章中未进行解释或介绍。我不确定这篇文章的作者是否意识到这里就是这种情况,但是在现实的数据集中发现这种错误并不罕见。

id在时间上不重叠;所有5个站点在2012年9月30日之前都使用一个ID,然后4个站点在第二天(即10月1日)更改了新行程的ID,但是随着 Andrew站点的出现,其下一个站点将关闭8个月新行程记录于2013-06-03。

相关问题