मुझे आदेशों की एक तालिका मिल गई है
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
डेटा के पास क्लाइंट_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
मेरे कुछ अन्य विचारों की तुलना में इस क्वेरी पर योजना की योजना (जैसे किसी तिथि पर किसी ग्राहक के लिए अस्थायी आदेशों की संख्या की गिनती करने वाले उप-प्रश्न) काफी छोटी है और मैं इससे बहुत खुश हूं। (तालिका का डिजाइन, मैं रोमांचित नहीं हूं)
अब, मुझे उन तिथियों के लिए सभी सक्रिय आदेशों को खोजने की आवश्यकता है, जो उन तिथियों के साथ सम्मिलित हैं, जिन पर वे सक्रिय हैं। उदाहरण के लिए, I की तिथि सीमा के 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()
मैं तारीखों की एक श्रृंखला उत्पन्न कर सकता हूं, लेकिन मुझे इस बात का कोई सुराग नहीं है कि तारीखों की एक तालिका प्राप्त करने और आईडी के क्रम में इसके साथ कैसे जुड़ें। मेरा कूबड़ एक क्रॉस जॉइन है लेकिन मैं यह नहीं समझ सकता कि इस परिस्थिति में उस काम को कैसे किया जाए।
धन्यवाद
अद्यतन एक एसक्यूएल बेला जोड़ा गया ।