有人能解释一下为什么在这个简单的SQL查询中这两个结果不同吗?

有人能解释一下为什么在这个简单的SQL查询中这两个结果不同吗?,sql,sqlite,Sql,Sqlite,我正在学习SQL,目前正在学习。数据集取自自行车共享服务Hubway,我试图回答以下问题:哪些站点最常用于往返? 这个问题涉及两个表格: 车站 旅行 以下是指南中建议的答案: SELECT stations.station AS "Station", COUNT(*) AS "Count" FROM trips INNER JOIN stations ON trips.start_station = stations.id WHERE trips.start_station = trips

我正在学习SQL,目前正在学习。数据集取自自行车共享服务Hubway,我试图回答以下问题:哪些站点最常用于往返?

这个问题涉及两个表格:

车站

旅行

以下是指南中建议的答案:

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
以及各自的输出:


我的回答省去了向导返回的两行。我想了解为什么会发生这种情况,因为我无法理解。

您的查询组在外键上,数字
开始\u站
列:

GROUP BY trips.start_station
但原始的是根据站点名称分组的:

GROUP BY stations.station
如果站点ID和站点名称之间有一对一的映射就可以了。然而,这里的情况并非如此

缺少的两行在数据库中列出两次,名称相同,但站点ID不同。根据桩号名称进行分组可获得这些名称的组合计数

事实上,有5个这样的电台。您可以使用
分组依据
拥有
查询所有此类电台(这允许您对聚合结果进行过滤,如
计数
,就像
其中
允许您对行进行过滤):

因此,上面显示了至少出现两次的所有桩号名称,对于生成以下内容的Hubway数据集:

Andrew车站-洪堡Pl 2多切斯特大道
费尔菲尔德2号博伊斯顿酒店
查尔斯圈-剑桥街2号查尔斯街
达德利广场2号
托马斯·梅尼诺市长-政府中心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.60 1410
查尔斯圈-剑桥圣查尔斯街113 1329
托马斯·梅尼诺市长-政府中心23 610
博伊斯顿费尔菲尔德103 458
费尔菲尔德博伊斯顿61 420
托马斯·梅尼诺市长-政府中心99 380
达德利广场56 203
安德鲁车站-洪堡多切斯特大道Pl 104 70
达德利广场100 57
安德鲁车站-洪堡多切斯特大道Pl 85 29
对于Charles Circle车站,1410+1329为2739,但仅针对
车站记录的Charles Circle车站回程次数。id=60
太低,无法显示在前5位查询中

现在,这篇文章没有解释或介绍为什么数据库中有多个相同名称的站点的多个ID。我不确定那篇文章的作者是否意识到了这一点,但在现实数据集中发现这样的错误并不罕见


ID在时间上不重叠;2012年9月30日之前,所有5个车站都使用一个ID,然后第二天,即10月1日,4个车站更改了新行程的ID,但安德鲁车站显然关闭了8个月,下一次新行程记录在2013年6月3日。

订单条款在您的实施中非常不同…@AlexK.:
订单依据
条款很好;他们对列使用别名,而不是重复
COUNT(*)
表达式。这在功能上是完全一样的。
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