выбор записей без значения - PullRequest
0 голосов
/ 15 ноября 2018

У меня проблема, когда я пытаюсь достичь желаемого результата.Задача выглядит просто - сделать ежедневный подсчет вхождений события для ведущих стран.

Основная таблица выглядит следующим образом:

id |            date            | country |   col1   |   col2   | ...
1  |    2018-01-01 21:21:21     |    US   | value 1  | value 2  | ...
2  |    2018-01-01 22:32:54     |    UK   | value 1  | value 2  | ...

Из этой таблицы я хочу получить ежедневное событиеподсчет по стране, который достигается с помощью

SELECT date::DATE AT TIME ZONE 'UTC', country, COALESCE(count(id),0) FROM tab1
GROUP BY 1, 2

Проблема возникает, когда 2 января 2018 года пользователь из Великобритании не произвел никакого события

country_events
   date    |  country | count
2018-01-01 |     US   |   23
2018-01-01 |     UK   |   5
2018-01-02 |     US   |   30
2018-01-02 |     UK   |   0  -> is desired result, but row is missing

Я пыталсясоздайте серию дат и ряд стран, которые я ищу, затем CROSS JOIN эти две таблицы.Это helper со столбцами date и country, которые я оставил объединенными с моей таблицей результатов, например

SELECT * FROM helper h
LEFT JOIN country_events c ON c.date::DATE = h.date::DATE AND c.country = h.country

Я использую PostgreSQL.

1 Ответ

0 голосов
/ 15 ноября 2018

Вам нужно внешнее объединение, а не перекрестное объединение:

SELECT tab1.date::date, tab1.country, coalesce(count(*), 0)
FROM generate_series(TIMESTAMP '2018-01-01 00:00:00',
                     TIMESTAMP '2018-01-31 00:00:00',
                     INTERVAL '1 day') AS ts(d)
   LEFT JOIN tab1 ON tab1.date >= ts.d AND tab1.date < ts.d + INTERVAL '1 day'
GROUP BY tab1.date::date, tab1.country
ORDER BY tab1.date::date, tab1.country;

Это даст желаемый список на январь 2018 года.

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