Bir sipariş tablom var
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
Veriler, bir client_id için örtüşmeyen duran siparişlere ve bazen eşleşen bir client_id'e sahip olduklarında başlangıç_tarihindeki duran siparişi geçersiz kılan geçici bir siparişe sahiptir. Aynı türden siparişlerin çakışmasını önleyen uygulama düzeyinde kısıtlamalar vardır.
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
Örneğin, 2015-07-1816 numaralı istemcide etkin sipariş olarak # 20 numaralı sipariş vardır, çünkü 19 numaralı siparişi geçersiz kılar. Bazı yaygara ile etkin bir sipariş kimliği bir tarihte sorgulamak için etkili bir yol buldum.
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
Bunu 2015-07-18yer tutucular olarak sorgularsanız ,
id
----
17
18
20
Diğer fikirlerim ile karşılaştırıldığında bu sorgudaki sorgu planı (bir tarihte bir müşteri için geçici sipariş sayısını sayan alt sorgular gibi) oldukça küçük ve bundan oldukça memnunum. (masanın tasarımı, heyecan duymuyorum)
Şimdi, etkin oldukları tarihlerle birleştirilen bir tarih aralığındaki tüm etkin siparişleri bulmak için a'ya ihtiyacım var. Örneğin, tarih aralığına sahip 2015-07-18üzere 2015-07-19I aşağıdaki sonucu istiyoruz.
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
Sipariş 20 geçersiz kılma üzerinde 19 sipariş 2015-07-18ancak üzerinde 2015-07-19.
Ben generate_series()bir tarih aralığı oluşturabilir ile buldum , ama tarihler ve sipariş kimlikleri bir tablo almak için bu ile katılmak nasıl bir ipucu yok. Benim önsezim çapraz bir birleşimdir, ancak bu durumda bunu nasıl çalıştıracağımı anlayamıyorum.
Teşekkürler
GÜNCELLEME Bir sql keman eklendi .