Я застрял в своем запросе SQL / Oracle ..
Для этого вопроса интересующие поля: effective_day
(td.ws_date), ot.valid_from
и ot.valid_to.
Для каждого effective_day
возвращается одна запись. Запись действительна до тех пор, пока она была отредактирована до или после effective_day
и до или после effective_day
.
Чтобы узнать, когда он действовал, мы смотрим на поля ot.valid_from
и ot.valid_to.
ot.valid_from <= effective_day <= ot.valid_to
order_no
может обновляться несколько раз в течение одного дня - поля valid_to
и valid_from
обновляются соответственно. Таким образом, в течение трех дней обновления для одного заказа могут выглядеть так:
ID |Order | Valid From | Valid To |
=================================================================
0 |112 | 07-SEP-11 21:13:12 | 08-SEP-11 01:02:11 |
1 |112 | 08-SEP-11 01:02:12 | 08-SEP-11 01:14:12 |
2 |112 | 08-SEP-11 01:14:13 | 09-SEP-11 05:23:51 |
3 |112 | 09-SEP-11 05:23:52 | 09-SEP-11 16:21:13 |
4 |112 | 09-SEP-11 16:21:14 | null |
Если я хочу вернуть детали заказа на effective_day = 08-SEP-11
. Возвращенные данные должны быть самыми последними обновленными данными за этот день. Так должно быть ID 2.
Аналогичным образом, если я хочу вернуть детали заказа для effective_day = 09-SEP-11
, тогда должен быть возвращен идентификатор 4.
Вот мой SQL
SELECT
td.ws_date effective_date,
ot.ORDER_NO,
ot.PROCESS_AREA,
ot.VALID_FROM,
ot.VALID_UNTIL
FROM ws_tracker_dates_tab td, ws_tracker_old_tab ot
WHERE (ot.VALID_FROM <= td.WS_DATE)
AND (ot.VALID_UNTIL IS NULL or (ot.VALID_UNTIL>=td.ws_date))
AND ot.COMPLETED = 'N'
AND td.WS_DATE BETWEEN (SYSDATE -30) AND (SYSDATE)
AND ot.process_area is not null
Буду признателен за любую помощь.