Bạn không cần CTE cho việc này, điều đó sẽ đắt hơn mức cần thiết.
Và bạn không cần truyền tới timestamp
, kết quả đã là của kiểu dữ liệu timestamp
khi bạn cấp timestamp
nhập vào generate_series()
. Thông tin chi tiết tại đây:
- Tạo chuỗi thời gian giữa hai ngày trong PostgreSQL
Trong Postgres 9.3 hoặc sau này, bạn có thể sử dụng LATERAL
tham gia:
SELECT to_char(ts, 'YYYY-MM-DD HH24') AS formatted_ts
FROM (
SELECT min(start_timestamp) as first_date
, max(start_timestamp) as last_date
FROM header_table
) h
, generate_series(h.first_date, h.last_date, interval '1 hour') g(ts);
Tùy chọn với to_char()
để nhận được kết quả là văn bản ở định dạng bạn đã đề cập.
Điều này hoạt động trong bất kỳ Phiên bản Postgres:
SELECT generate_series(min(start_timestamp)
, max(start_timestamp)
, interval '1 hour') AS ts
FROM header_table;
Thường nhanh hơn một chút.
Gọi các hàm set-return trong SELECT
danh sách là một tính năng SQL không chuẩn và bị một số người khó chịu. Ngoài ra, có những hành vi kỳ quặc (mặc dù không phải đối với trường hợp đơn giản này) cuối cùng đã được khắc phục trong Postgres 10. Xem:
- Hành vi mong đợi cho nhiều hàm trả về trong mệnh đề SELECT là gì?
Lưu ý một sự khác biệt nhỏ trong NULL xử lý:
Tương đương với
max(start_timestamp)
được lấy bằng
ORDER BY start_timestamp DESC NULLS LAST
LIMIT 1
Không có NULLS LAST
Giá trị NULL đến đầu tiên theo thứ tự giảm dần (nếu có có thể là giá trị NULL trong start_timestamp
). Bạn sẽ nhận được NULL cho last_date
và truy vấn của bạn sẽ trống.
Chi tiết:
- Tại sao các giá trị NULL lại xuất hiện đầu tiên khi đặt hàng DESC trong một truy vấn PostgreSQL?