ฉันมีตารางคำสั่งซื้อแล้ว
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
ข้อมูลมีคำสั่งยืนไม่ทับซ้อนกันสำหรับ client_id และบางครั้งคำสั่งชั่วคราวที่แทนที่คำสั่งหยุดงานใน start_date เมื่อพวกเขามี client_id ที่ตรงกัน มีข้อ จำกัด ในระดับแอปพลิเคชันทำให้คำสั่งซื้อประเภทเดียวกันไม่ทับซ้อนกัน
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
ตัวอย่างเช่นใน2015-07-18
ไคลเอนต์ 16 มีคำสั่งซื้อ # 20 เนื่องจากเป็นคำสั่งที่ใช้งานอยู่เพราะจะแทนที่คำสั่งซื้อที่ยืน # 19 ด้วยความเอะอะบางอย่างฉันพบวิธีที่มีประสิทธิภาพในการค้นหารหัสคำสั่งซื้อที่ใช้งานอยู่ในวันที่
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
หากคุณค้นหาด้วย2015-07-18
ตัวยึดตำแหน่งคุณจะได้รับ
id
----
17
18
20
แผนแบบสอบถามในแบบสอบถามนี้เปรียบเทียบกับแนวคิดอื่น ๆ ของฉัน (เช่นข้อความค้นหาย่อยที่นับจำนวนคำสั่งซื้อชั่วคราวสำหรับลูกค้าในวันที่) มีขนาดค่อนข้างเล็กและฉันก็ค่อนข้างพอใจกับมัน (การออกแบบของตารางฉันไม่ได้ตื่นเต้นเกี่ยวกับ)
ตอนนี้ฉันต้องการ a เพื่อค้นหาคำสั่งซื้อที่ใช้งานอยู่ทั้งหมดสำหรับช่วงวันที่ที่เข้าร่วมกับวันที่ที่พวกเขาเปิดใช้งาน ตัวอย่างเช่นด้วยช่วงวันที่2015-07-18
ถึง2015-07-19
ฉันต้องการผลลัพธ์ต่อไปนี้
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
สั่งซื้อ 20 แทนที่สั่งซื้อ 19 แต่ไม่ได้อยู่ใน2015-07-18
2015-07-19
ฉันพบกับgenerate_series()
ฉันสามารถสร้างช่วงของวันที่ แต่ฉันไม่ได้รู้วิธีการเข้าร่วมกับสิ่งนี้เพื่อรับตารางวันที่และรหัสการสั่งซื้อ ลางสังหรณ์ของฉันคือการเข้าร่วมไขว้ แต่ฉันไม่สามารถเข้าใจวิธีการทำงานในสถานการณ์นี้
ขอบคุณ
UPDATE เพิ่มซอ SQL