Postgres - Взятие Величайшего из столбцов, созданных из JSON - PullRequest
0 голосов
/ 20 марта 2020

У меня есть столбец JSON в БД Postgres, в котором есть ключи даты недели и значения посещений на эту дату. Я хочу получить максимальное количество дней и добавить его в виде столбца рядом со значениями для всех дней недели.

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

Почему понедельник не существует после извлечения его из JSON? Внутренний запрос работает нормально и возвращает все дни и соответствующие значения, как я ожидал (со столбцами понедельник, вторник, среда, четверг, пятница). Я думал, что было бы относительно легко затем запросить эти столбцы и получить наибольшее.

SELECT Monday, Tuesday, Wednesday, Thursday, Friday,
GREATEST(Monday, Tuesday, Wednesday, Thursday, Friday) as MaxDay
FROM "VisitData"
WHERE
    (SELECT 
        popularity_by_day ->> 'Monday' AS Monday,
        popularity_by_day ->> 'Tuesday' AS Tuesday,
        popularity_by_day ->> 'Wednesday' AS Wednesday,
        popularity_by_day ->> 'Thursday' AS Thursday,
        popularity_by_day ->> 'Friday' AS Friday
    FROM "VisitData")

ОБНОВЛЕНИЕ:

Теперь у меня есть этот запрос после псевдонима псевдонима:

    SELECT Monday, Tuesday, Wednesday, Thursday, Friday,
    GREATEST(Monday, Tuesday, Wednesday, Thursday, Friday) as MaxDay
    FROM
        (SELECT 
            popularity_by_day ->> 'Monday' AS Monday,
            popularity_by_day ->> 'Tuesday' AS Tuesday,
            popularity_by_day ->> 'Wednesday' AS Wednesday,
            popularity_by_day ->> 'Thursday' AS Thursday,
            popularity_by_day ->> 'Friday' AS Friday
    FROM "VisitData") AS visits
    ```

This gives me the structure of the output im expecting but the results are inconsistent.

For example row 1 in the result
Monday = 5
Tuesday = 89
Wednesday = 95
Thursday = 120
Friday = 102
MaxDay = 95  (why not 120)

And for row 2
Monday = 329
Tuesday = 350
Wednesday = 439
Thursday = 397
Friday = 314
MaxDay = 439 (This is correct)

1 Ответ

2 голосов
/ 20 марта 2020

Я думаю, что вы хотите боковое соединение:

SELECT v.Monday, v.Tuesday, v.Wednesday, v.Thursday, v.Friday,
       GREATEST(v.Monday, v.Tuesday, v.Wednesday, v.Thursday, v.Friday) as MaxDay
FROM "VisitData" vd CROSS JOIN LATERAL
     (SELECT vd.popularity_by_day ->> 'Monday' AS Monday,
             vd.popularity_by_day ->> 'Tuesday' AS Tuesday,
             vd.popularity_by_day ->> 'Wednesday' AS Wednesday,
             vd.popularity_by_day ->> 'Thursday' AS Thursday,
             vd.popularity_by_day ->> 'Friday' AS Friday
     ) v;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...