Почему иногда я получаю последнюю переменную в столбце, а иногда и все разные переменные в столбце?

#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 часа, еще раз просмотрел запрос и сам это понял. Когда вы слишком много думаете о чем-то, вы не можете увидеть простых ответов.