Проблема синтаксиса при соединении с использованием 2 переменных - PullRequest
0 голосов
/ 17 июня 2020

Мне нужна помощь. Понятия не имею, почему мой код не работает в panda sql. Также, если есть лучший способ решить проблему, пожалуйста, помогите мне!

Автобусы

sn  origin  destination     time
10  warsaw  berlin  10:55
20  berlin  paris   6:20
21  berlin  paris   14:00
22  berlin  paris   21:40
30  paris   madrid  13:30

Пассажиры

sn  origin  destination time
1   paris   madrid  13:30
2   paris   madrid  13:31
10  warsaw  paris   10:00
11  warsaw  berlin  22:31
40  berlin  paris   6:15
41  berlin  paris   6:50
42  berlin  paris   7:12
43  berlin  paris   12:03
44  berlin  paris   20:00

Каждая строка таблицы содержит автобусы информация об отправлении, пункте назначения и времени отправления одного автобуса. Каждая строка таблицы «пассажиры» описывает одного пассажира и содержит информацию о станции, от которой и на которую они едут. Пассажиры сядут на самый ранний автобус, который отправится прямо к месту назначения. Они могут сесть, даже если они достигли той же минуты, что и время отправления. Укажите количество пассажиров, садившихся в каждый автобус.

Результат должен выглядеть так:

sn  passengers_on_board
10  0
20  1
21  3
22  1
30  1

Мой код (выполняется в sqlite3 panda sql в блокноте jupyter):

SELECT b.sn, COUNT(p.sn) passengers_on_board
FROM buses b
LEFT JOIN passengers p
ON b.origin = p.origin 
AND b.destination = p.destination
WHERE date b.time <= date p.time
GROUP BY b.sn
ORDER BY b.sn

Ошибка: PandaSQLException: (sqlite3.OperationalError) рядом с «b»: синтаксическая ошибка

1 Ответ

0 голосов
/ 17 июня 2020

Вы получаете синтаксическую ошибку из-за этой строки:

date b.time <= date p.time

Я думаю, что вы пытаетесь преобразовать time в тип данных date, но это невозможно сделать в SQLite, как это (или каким-либо образом, поскольку время или дата - это просто текст).

Сначала вы должны изменить формат столбцов time в обеих таблицах, чтобы они были hh:mm. Таким образом, время сопоставимо.

Затем измените условие:

b.time <= p.time

на:

p.time <= b.time 

и переместите его в предложение ON, а также используйте NOT EXISTS:

SELECT b.sn, COUNT(p.sn) passengers_on_board
FROM buses b LEFT JOIN passengers p
ON b.origin = p.origin AND b.destination = p.destination AND p.time <= b.time
AND NOT EXISTS (
  SELECT 1 FROM buses 
  WHERE origin = b.origin AND destination = b.destination
  AND time < b.time AND p.time <= time
)
GROUP BY b.sn
ORDER BY b.sn 

См. Демонстрацию . Результатов:

| sn  | passengers_on_board |
| --- | ------------------- |
| 10  | 0                   |
| 20  | 1                   |
| 21  | 3                   |
| 22  | 1                   |
| 30  | 1                   |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...