Может кто-нибудь объяснить, почему эти два результата отличаются в этом простом запросе SQL? - PullRequest
0 голосов
/ 14 января 2019

Я переучиваю SQL и в настоящее время следую этому руководству по запросу данных . Набор данных взят из службы совместного использования велосипедов Hubway, и я пытаюсь ответить на вопрос: Какие станции чаще всего используются для поездок в оба конца?

Этот вопрос включает две таблицы:

Станции

stations table

Экскурсии

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

В моем ответе пропущены 2 строки, которые возвращал ответ гида. Я хотел бы понять, почему это происходит, потому что я не могу понять это.

1 Ответ

0 голосов
/ 15 января 2019

Группы запросов по внешнему ключу, числовой столбец start_station:

GROUP BY trips.start_station

но оригинал группируется по названию станции:

GROUP BY stations.station

Это было бы хорошо, если бы существовало однозначное сопоставление между идентификаторами станций и названиями станций. Однако это не так.

Обе пропущенные строки перечислены дважды в базе данных под тем же именем, но с разными идентификаторами станций. Группировка по названию станции дает вам объединенные подсчеты для этих названий.

На самом деле таких станций 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 станций, когда мы ограничиваем ваш запрос не числом строк, а вместо этого фильтруем дублированные названия станций. Я добавил в идентификатор станции:

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, но счет только для 1010 * Charles Circle возвратов на станцию, зарегистрированных против stations.id=60, слишком мал для отображения в ваш топ-5 запросов.

Теперь, , почему база данных имеет несколько идентификаторов для нескольких станций с одинаковым именем, не объясняется и не рассматривается в этой статье. Я не уверен, понял ли автор этой статьи, что это именно тот случай, но такие ошибки встречаются в реальных наборах данных.

Идентификаторы не перекрываются во времени; все 5 станций используют один ID до 2012-09-30, затем 4 станции изменили свой ID для новых поездок на следующий день, 1 октября, но с Andrew Station , очевидно, отключенным на 8 месяцев со следующим новым поездка записана 2013-06-03.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...