주문 테이블이 있습니다
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에 대해 중복되지 않는 스탠딩 순서가 있으며 때로는 client_id가 일치 할 때 start_date의 스탠딩 순서를 무시하는 임시 주문이 있습니다. 동일한 유형의 주문이 겹치지 않도록하는 애플리케이션 레벨 제한 사항이 있습니다.
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의 경우 주문 # 19보다 우선하므로 활성 주문이므로 주문 # 20이 있습니다. 약간의 소란으로 날짜에 활성 주문 ID를 쿼리하는 효율적인 방법을 발견했습니다.
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
이 쿼리에 대한 쿼리 계획은 다른 아이디어와 비교했을 때 (날짜에 대한 클라이언트의 임시 주문 수를 계산하는 하위 쿼리와 같이) 매우 작으며 매우 만족합니다. (테이블의 디자인, 나는 흥분하지 않습니다)
이제 날짜 범위와 활성화 된 날짜 범위에 대한 모든 활성 주문을 찾아야합니다. 예를 들어 날짜 범위가 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()날짜 범위를 생성 할 수 있다는 것을 알았지 만 날짜와 주문 ID를 얻기 위해 이것과 결합하는 방법에 대한 실마리는 없습니다. 내 직감은 교차 조인이지만이 상황에서 어떻게 작동하는지 알 수 없습니다.
감사
업데이트 SQL 바이올린을 추가했습니다 .