PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Postgres - làm thế nào để trả về các hàng có số lượng 0 cho dữ liệu bị thiếu?

Giải pháp thích hợp

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;
  • Sử dụng LEFT JOIN , tất nhiên.

  • generate_series() có thể tạo một bảng dấu thời gian một cách nhanh chóng và rất nhanh.

  • Nói chung, tổng hợp trước sẽ nhanh hơn bạn tham gia. Gần đây, tôi đã cung cấp một trường hợp thử nghiệm trên sqlfiddle.com trong câu trả lời có liên quan này:

    • PostgreSQL - sắp xếp theo một mảng
  • Truyền timestamp đến date (::date ) cho một định dạng cơ bản. Để sử dụng thêm to_char() .

  • GROUP BY 1 là viết tắt cú pháp để tham chiếu cột đầu ra đầu tiên. Có thể là GROUP BY day nhưng điều đó có thể xung đột với một cột hiện có cùng tên. Hoặc GROUP BY date_trunc('month', date_col)::date nhưng điều đó quá lâu so với sở thích của tôi.

  • Hoạt động với các đối số khoảng thời gian có sẵn cho date_trunc() .

  • count() không bao giờ tạo ra NULL (0 không có hàng), nhưng LEFT JOIN hiện.
    Để trả về 0 thay vì NULL trong SELECT bên ngoài , sử dụng COALESCE(some_count, 0) AS some_count . Hướng dẫn sử dụng.

  • Để có giải pháp chung chung hơn hoặc khoảng thời gian tùy ý hãy xem xét câu trả lời có liên quan chặt chẽ này:

    • Cách tốt nhất để đếm các bản ghi theo khoảng thời gian tùy ý trong 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. Trong PostgreSQL, làm thế nào để chèn dữ liệu bằng lệnh COPY?

  2. sqlalchemy.exc.NoSuchModuleError:Không thể tải plugin:sqlalchemy.dialects:postgres

  3. Cách bảo mật cơ sở dữ liệu PostgreSQL của bạn - 10 mẹo

  4. Làm thế nào để PostgreSQL thực thi ràng buộc DUY NHẤT / loại chỉ mục nào nó sử dụng?

  5. Câu lệnh Postgresql đơn giản - tên cột không tồn tại