У мене є таблиця замовлень
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
План запитів щодо цього запиту порівняно з деякими іншими моїми ідеями (наприклад, підзапити, що підраховують кількість тимчасових замовлень для клієнта на дату) досить невеликий, і я його дуже задоволений. (дизайн столу, я не в захваті від)
Тепер мені потрібно знайти всі активні замовлення для діапазону дат, з'єднаних із датами, на які вони активні. Наприклад, діапазон дат , 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()що можу створити діапазон дат, але я не маю поняття, як би це зробити, щоб отримати таблицю дат та ідентифікаторів замовлення. Моя думка - це перехресне з'єднання, але я не можу зрозуміти, як змусити цю роботу в цій ситуації.
Дякую
ОНОВЛЕННЯ Додано загадку sql .