Tôi đã có một bảng đơn đặt hàng
Column | Type | Modifiers
------------+-----------------------------+-----------------------------------------------------
id | integer | not null default nextval('orders_id_seq'::regclass)
client_id | integer | not null
start_date | date | not null
end_date | date |
order_type | character varying | not null
Dữ liệu không có các lệnh đứng không trùng nhau cho client_id và đôi khi là một lệnh tạm thời ghi đè lên lệnh đứng trên đó là start_date khi chúng có client_id khớp. Có các ràng buộc cấp độ ứng dụng giữ cho các đơn đặt hàng cùng loại không bị chồng chéo.
id | client_id | start_date | end_date | order_type
----+-----------+------------+------------+------------
17 | 11 | 2014-02-05 | | standing
18 | 15 | 2014-07-16 | 2015-07-19 | standing
19 | 16 | 2015-04-01 | | standing
20 | 16 | 2015-07-18 | 2015-07-18 | temporary
Ví dụ: trên 2015-07-18
máy khách 16 có thứ tự số 20 là thứ tự hoạt động vì nó ghi đè lên thứ tự đứng số 19. Với một số phiền phức, tôi đã tìm thấy một cách truy vấn hiệu quả cho id của đơn hàng đang hoạt động vào một ngày.
SELECT id from (
SELECT
id,
first_value(id) OVER (PARTITION BY client_id ORDER BY order_type DESC) active_order_id
FROM orders
WHERE start_date <= ? and (end_date is null OR end_date >= ?)
) active_orders
WHERE id = active_order_id
Nếu bạn truy vấn điều này với 2015-07-18
tư cách là người giữ chỗ, bạn sẽ nhận được
id
----
17
18
20
Kế hoạch truy vấn trên truy vấn này so với một số ý tưởng khác của tôi (như truy vấn phụ đếm số lượng đơn đặt hàng tạm thời cho một khách hàng vào một ngày) là khá nhỏ và tôi khá hài lòng với nó. (thiết kế của bảng, tôi không vui mừng)
Bây giờ, tôi cần tìm tất cả các đơn đặt hàng đang hoạt động cho phạm vi ngày được kết hợp với ngày họ đang hoạt động. Ví dụ, với phạm vi ngày 2015-07-18
để 2015-07-19
tôi muốn kết quả sau.
active_date | id
------------+----
2015-07-18 | 17
2015-07-18 | 18
2015-07-18 | 20
2015-07-19 | 17
2015-07-19 | 18
2015-07-19 | 19
Lệnh 20 ghi đè thứ tự 19 trên 2015-07-18
nhưng không bật 2015-07-19
.
Tôi đã tìm thấy với generate_series()
tôi có thể tạo ra một loạt các ngày, nhưng tôi không biết làm thế nào để tham gia cùng với điều này để có được một bảng ngày và thứ tự id. Linh cảm của tôi là một sự tham gia chéo nhưng tôi không thể tìm ra cách để làm cho công việc đó trong hoàn cảnh này.
Cảm ơn
CẬP NHẬT Đã thêm một fiddle sql .