PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Postgres - как да върна редове с 0 броя за липсващи данни?

Правилно решение

SELECT *
FROM  (
   SELECT day::date
   FROM   generate_series(timestamp '2007-12-01'
                        , timestamp '2008-12-01'
                        , interval  '1 month') day
   ) d
LEFT   JOIN (
   SELECT date_trunc('month', date_col)::date AS day
        , count(*) AS some_count
   FROM   tbl
   WHERE  date_col >= date '2007-12-01'
   AND    date_col <= date '2008-12-06'
-- AND    ... more conditions
   GROUP  BY 1
   ) t USING (day)
ORDER  BY day;
  • Използвайте LEFT JOIN , разбира се.

  • generate_series() може да създаде таблица с времеви марки в движение и много бързо.

  • Като цяло е по-бързо да се обобщава преди присъединяваш се. Наскоро предоставих тестов случай на sqlfiddle.com в този свързан отговор:

    • PostgreSQL – подреждане по масив
  • Прехвърляне на timestamp до date (::date ) за основен формат. За повече използвайте to_char() .

  • GROUP BY 1 е синтаксис стенография за препратка към първата изходна колона. Може да е GROUP BY day също, но това може да е в конфликт със съществуваща колона със същото име. Или GROUP BY date_trunc('month', date_col)::date но това е твърде дълго за моя вкус.

  • Работи с наличните интервални аргументи за date_trunc() .

  • count() никога не произвежда NULL (0 без редове), но LEFT JOIN прави.
    За връщане на 0 вместо NULL във външния SELECT , използвайте COALESCE(some_count, 0) AS some_count . Ръководството.

  • За по-общо решение или произволни интервали от време помислете за този тясно свързан отговор:

    • Най-добрият начин за преброяване на записи чрез произволни интервали от време в Rails+Postgres


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgres:проверете дали полето на масива съдържа стойност?

  2. Интегриране на инструменти за управление на PostgreSQL в производството

  3. Свързване с Heroku Postgres от Spring Boot

  4. n-ти процентил изчисления в postgresql

  5. Как да предам парола на pg_dump?