PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Postgres - jak zwrócić wiersze z liczbą 0 za brakujące dane?

Właściwe rozwiązanie

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;
  • Użyj LEFT JOIN , oczywiście.

  • generate_series() może tworzyć tabelę znaczników czasu w locie i bardzo szybko.

  • Zazwyczaj agregacja jest szybsza przed ty dołącz. Niedawno przedstawiłem przypadek testowy na sqlfiddle.com w tej powiązanej odpowiedzi:

    • PostgreSQL — uporządkowanie według tablicy
  • Prześlij timestamp do date (::date ) dla formatu podstawowego. Aby uzyskać więcej, użyj to_char() .

  • GROUP BY 1 jest skrótem składni odnoszącym się do pierwszej kolumny wyjściowej. Może być GROUP BY day ale może to kolidować z istniejącą kolumną o tej samej nazwie. Lub GROUP BY date_trunc('month', date_col)::date ale to za długo jak na mój gust.

  • Działa z dostępnymi argumentami interwału dla date_trunc() .

  • count() nigdy nie tworzy NULL (0 bez wierszy), ale LEFT JOIN robi.
    Aby zwrócić 0 zamiast NULL w zewnętrznym SELECT , użyj COALESCE(some_count, 0) AS some_count . Instrukcja.

  • Dla bardziej ogólnego rozwiązania lub arbitralnych przedziałów czasowych rozważ tę ściśle powiązaną odpowiedź:

    • Najlepszy sposób na liczenie rekordów w dowolnych odstępach czasu w 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. Jak sprawić, by wyliczenia Java i Postgres współpracowały ze sobą w celu aktualizacji?

  2. Korzystanie z funkcji okna w instrukcji aktualizacji

  3. Przyrostowa kopia zapasowa PostgreSQL i odzyskiwanie do określonego momentu

  4. Napraw „BŁĄD:każde zapytanie INTERSECT musi mieć taką samą liczbę kolumn” w PostgreSQL

  5. ST_DWithin przyjmuje parametr jako stopień , a nie metry , dlaczego?