我正在重新学习SQL,目前正在关注此dataquest guide。该数据集来自自行车共享服务Hubway,我想回答这个问题:哪个车站最常用于往返?
此问题涉及两个表:
电台
Trips
这是指南中建议的答案:
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;
以及相应的输出:
这是我的答案:
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
以及相应的输出:
我的答案省略了指南的答案返回的两行。我想了解为什么会这样,因为我无法弄清楚。
答案 0 :(得分:1)
您在外键(数字start_station
列)上的查询组:
GROUP BY trips.start_station
但原始分组在电台名称上
GROUP BY stations.station
如果站点ID和站点名称之间存在一对一的映射,那就很好了。但是,这里不是这种情况。
在数据库中,两次列出了您丢失的两行,它们的名称相同,但工作站ID不同。按电台名称分组可为您提供这些名称的总计数。
事实上,有5个这样的电台。您可以使用GROUP BY
和HAVING
来查询所有此类电台(可以像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。