Как вы выбираете данные из базы данных PostgreSQL, но если данных за данный день нет, то возвращает 0? - PullRequest
0 голосов
/ 16 июля 2011

У меня следующий запрос:

SELECT created_at::DATE, count (*) 
FROM messages      
WHERE city = 'los angeles'     
GROUP BY created_at::DATE

, который прекрасно работает.Сложность состоит в том, что если на определенную дату нет сообщений, то запись на эту дату не возвращается.Как сделать так, чтобы вышеуказанный запрос возвращал дату и 0, если в эту дату нет сообщений, для всех дней между данной датой и сегодняшним днем?

Работаетв PostgreSQL 8.3.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 16 июля 2011

Похоже, вам нужна таблица всех интересующих вас дат, поскольку она может содержать даты, которых нет в вашей таблице сообщений. Если вы создали или создали эту таблицу, оставьте соединение с таблицей сообщений и посчитайте столбец этой таблицы - он вернет 0, если ничто не соответствует соединению.

select d.created_at, count(m.messageId)
from possibleDates d
left join messages m
    on d.created_at = m.created_at
group by d.created_at
2 голосов
/ 17 июля 2011

Очень часто, когда вы хотите заполнить нули для пропущенных записей в серии, ответ в PostgreSQL включает функцию generate_series. (Найдите Stackoverflow для множества похожих вопросов и ответов.) В вашем случае используйте что-то вроде этого:

SELECT ts::date AS date, coalesce(count, 0) AS count
FROM
  (SELECT created_at::date, count(*)
   FROM messages
   WHERE city = 'los angeles'
   GROUP BY created_at::date) AS m
  RIGHT JOIN
  (SELECT *
   FROM generate_series(timestamp '2011-07-01',
                        timestamp 'today',
                        interval '1 day')) AS series(ts)
  ON m.created_at = series.ts
ORDER BY 1;
2 голосов
/ 16 июля 2011

Типичный способ состоит в том, чтобы иметь отдельную таблицу календаря со всеми датами в ней, оставить присоединенной к вашей таблице в столбце даты, а затем какой-то оператор ifnull (x, 0) [независимо от того, какая функция предназначена для PostgreSQL] или оператор case возвращает 0, когда left-join в дате возвращает null, или 1, если он не равен null. Затем вы можете создать свою обычную группу и использовать SUM (x) вместо count ().

...