#sqlite
#sqlite
Вопрос:
Я работаю с набором данных YELP. Это будет довольно сложно объяснить, но я сделаю все возможное. Я пытаюсь открыть все рестораны из одного города, в данном случае Феникса. Когда я запускаю запрос ниже
SELECT b.city
,c.category
,b.name
,b.review_count
,h.hours
,CASE
WHEN h.hours LIKE 'Monday%'
THEN 1
WHEN h.hours LIKE 'Tuesday%'
THEN 2
WHEN h.hours LIKE 'Wednesday%'
THEN 3
WHEN h.hours LIKE 'Thursday%'
THEN 4
WHEN h.hours LIKE 'Friday%'
THEN 5
WHEN h.hours LIKE 'Saturday%'
THEN 6
WHEN h.hours LIKE 'Sunday%'
THEN 7
END AS day
,CASE
WHEN b.stars between 2
AND 3
THEN '2-3 stars'
WHEN b.stars between 4
AND 5
THEN '4-5 stars'
END AS star
FROM business b
INNER JOIN category c ON b.id = c.business_id
INNER JOIN hours h ON b.id = h.business_id
WHERE TRIM(c.category) = 'Restaurants'
AND TRIM(b.city) = 'Phoenix'
AND star IS NOT NULL
Я получил результат, который выглядит так:
--------- ------------- ---------------------------------------- -------------- ----------------------- ----- -----------
| Phoenix | Restaurants | McDonald's | 8 | Monday|5:00-23:00 | 1 | 2-3 stars |
| Phoenix | Restaurants | McDonald's | 8 | Tuesday|5:00-23:00 | 2 | 2-3 stars |
| Phoenix | Restaurants | McDonald's | 8 | Friday|5:00-0:00 | 5 | 2-3 stars |
| Phoenix | Restaurants | McDonald's | 8 | Wednesday|5:00-23:00 | 3 | 2-3 stars |
| Phoenix | Restaurants | McDonald's | 8 | Thursday|5:00-23:00 | 4 | 2-3 stars |
| Phoenix | Restaurants | McDonald's | 8 | Sunday|5:00-23:00 | 7 | 2-3 stars |
| Phoenix | Restaurants | McDonald's | 8 | Saturday|5:00-0:00 | 6 | 2-3 stars |
| Phoenix | Restaurants | Charlie D's Catfish amp; Chicken | 7 | Monday|11:00-18:00 | 1 | 4-5 stars |
| Phoenix | Restaurants | Charlie D's Catfish amp; Chicken | 7 | Tuesday|11:00-18:00 | 2 | 4-5 stars |
| Phoenix | Restaurants | Charlie D's Catfish amp; Chicken | 7 | Friday|11:00-18:00 | 5 | 4-5 stars |
| Phoenix | Restaurants | Charlie D's Catfish amp; Chicken | 7 | Wednesday|11:00-18:00 | 3 | 4-5 stars |
| Phoenix | Restaurants | Charlie D's Catfish amp; Chicken | 7 | Thursday|11:00-18:00 | 4 | 4-5 stars |
| Phoenix | Restaurants | Charlie D's Catfish amp; Chicken | 7 | Sunday|13:00-16:00 | 7 | 4-5 stars |
| Phoenix | Restaurants | Charlie D's Catfish amp; Chicken | 7 | Saturday|11:00-18:00 | 6 | 4-5 stars |
| Phoenix | Restaurants | Gallagher's | 60 | Monday|11:00-0:00 | 1 | 2-3 stars |
| Phoenix | Restaurants | Gallagher's | 60 | Tuesday|11:00-0:00 | 2 | 2-3 stars |
| Phoenix | Restaurants | Gallagher's | 60 | Friday|11:00-2:00 | 5 | 2-3 stars |
| Phoenix | Restaurants | Gallagher's | 60 | Wednesday|11:00-0:00 | 3 | 2-3 stars |
| Phoenix | Restaurants | Gallagher's | 60 | Thursday|11:00-2:00 | 4 | 2-3 stars |
| Phoenix | Restaurants | Gallagher's | 60 | Sunday|9:00-0:00 | 7 | 2-3 stars |
| Phoenix | Restaurants | Gallagher's | 60 | Saturday|9:00-2:00 | 6 | 2-3 stars |
| Phoenix | Restaurants | Bootleggers Modern American Smokehouse | 431 | Monday|11:00-22:00 | 1 | 4-5 stars |
| Phoenix | Restaurants | Bootleggers Modern American Smokehouse | 431 | Tuesday|11:00-22:00 | 2 | 4-5 stars |
| Phoenix | Restaurants | Bootleggers Modern American Smokehouse | 431 | Friday|11:00-22:00 | 5 | 4-5 stars |
| Phoenix | Restaurants | Bootleggers Modern American Smokehouse | 431 | Wednesday|11:00-22:00 | 3 | 4-5 stars |
--------- ------------- ---------------------------------------- -------------- ----------------------- ----- -----------
(Output limit exceeded, 25 of 28 total rows shown)
Поэтому я подумал, что, чтобы хорошо видеть время работы, я буду создавать новый столбец для каждого дня с помощью запроса ниже:
SELECT b.city
,c.category
,b.name
,b.review_count
,MAX(CASE
WHEN H.hours LIKE "%monday%"
THEN TRIM(H.hours, '%MondayTuesWednesThursFriSatSun|%')
END) AS monday_hours
,MAX(CASE
WHEN H.hours LIKE "%tuesday%"
THEN TRIM(H.hours, '%MondayTuesWednesThursFriSatSun|%')
END) AS tuesday_hours
,MAX(CASE
WHEN H.hours LIKE "%wednesday%"
THEN TRIM(H.hours, '%MondayTuesWednesThursFriSatSun|%')
END) AS wednesday_hours
,MAX(CASE
WHEN H.hours LIKE "%thursday%"
THEN TRIM(H.hours, '%MondayTuesWednesThursFriSatSun|%')
END) AS thursday_hours
,MAX(CASE
WHEN H.hours LIKE "%friday%"
THEN TRIM(H.hours, '%MondayTuesWednesThursFriSatSun|%')
END) AS friday_hours
,MAX(CASE
WHEN H.hours LIKE "%saturday%"
THEN TRIM(H.hours, '%MondayTuesWednesThursFriSatSun|%')
END) AS saturday_hours
,MAX(CASE
WHEN H.hours LIKE "%sunday%"
THEN TRIM(H.hours, '%MondayTuesWednesThursFriSatSun|%')
END) AS sunday_hours
,CASE
WHEN b.stars BETWEEN 2
AND 3
THEN '2-3 stars'
WHEN b.stars BETWEEN 4
AND 5
THEN '4-5 stars'
END AS star
FROM business b
LEFT JOIN category c ON b.id = c.business_id
LEFT JOIN hours h ON b.id = h.business_id
WHERE TRIM(c.category) = 'Restaurants'
AND TRIM(b.city) = 'Phoenix'
И я получил:
--------- ------------- ------------- -------------- -------------- --------------- ----------------- ---------------- -------------- ---------------- -------------- -----------
| city | category | name | review_count | monday_hours | tuesday_hours | wednesday_hours | thursday_hours | friday_hours | saturday_hours | sunday_hours | star |
--------- ------------- ------------- -------------- -------------- --------------- ----------------- ---------------- -------------- ---------------- -------------- -----------
| Phoenix | Restaurants | Gallagher's | 60 | 5:00-23:00 | 5:00-23:00 | 5:00-23:00 | 5:00-23:00 | 5:00-0:00 | 9:00-2:00 | 9:00-0:00 | 2-3 stars |
--------- ------------- ------------- -------------- -------------- --------------- ----------------- ---------------- -------------- ---------------- -------------- -----------
Похоже, я хотел, но где-то я потерял все остальные рестораны. Тот, который указан надлежащим образом, является последним в наборе данных. Поэтому вместо того, чтобы возвращать их все, компьютер просто перезаписывает результат. Что я должен изменить в коде, чтобы получить список времени работы всех ресторанов?
Ответ №1:
Проблема с вашим кодом заключается в том, что вы агрегируете без GROUP BY
предложения, поэтому результатом является только 1 строка.
Добавить в свой запрос:
GROUP BY b.city, c.category, b.name, b.review_count, b.stars
Комментарии:
1. Это правильный ответ. Спасибо. Я оставил его утром, вернулся через 2 часа, еще раз просмотрел запрос и сам это понял. Когда вы слишком много думаете о чем-то, вы не можете увидеть простых ответов.