2014-12-19 4 views
2

У меня возникла проблема с получением отдельной предыдущей даты отчета из моего измерения даты. Мне нужно заполнить 12 предыдущих отчетных дат (отдельных) для данной календарной даты. Эта отчетная дата заселена по деловым правилам caertian. Для instnaceOracle Предварительная дата Запросы

CAL_DATE RPT_DATE 
22-Nov-14 24-Nov-14 
23-Nov-14 24-Nov-14 
24-Nov-14 24-Nov-14 
25-Nov-14 25-Nov-14 
26-Nov-14 26-Nov-14 
27-Nov-14 1-Dec-14 
28-Nov-14 1-Dec-14 
29-Nov-14 1-Dec-14 
30-Nov-14 1-Dec-14 
1-Dec-14 1-Dec-14 
2-Dec-14 2-Dec-14 
3-Dec-14 3-Dec-14 
4-Dec-14 4-Dec-14 
5-Dec-14 5-Dec-14 
6-Dec-14 8-Dec-14 
7-Dec-14 8-Dec-14 

о/р я ищу,

DAT_DATE_ RPT_DT PRIOR1 PRIOR12 PRIOR3 PRIOR4 PRIOR5 PRIOR6 
4-Dec-14 3-Dec-14 2-Dec-14 1-Dec-14 26-Nov-14 25-Nov-14 24-Nov-14 21-Nov-14 
3-Dec-14 2-Dec-14 1-Dec-14 26-Nov-14 25-Nov-14 24-Nov-14 21-Nov-14 20-Nov-14 

Запрос я использовал для этого

select DAT_DATE_DT,dat_sls_wrk_rpt_dt,Prior1,Prior2,Prior3,Prior4,Prior5,Prior6,Prior7,Prior8,Prior9,Prior10 from (
    select DAT_DATE_DT, 
    dat_sls_wrk_rpt_dt, 
    lag(dat_sls_wrk_rpt_dt,1)over (partition by DAT_DATE_DT order by dat_sls_wrk_rpt_dt) AS Prior1, 
    lag(dat_sls_wrk_rpt_dt,2)over (partition by DAT_DATE_DT order by dat_sls_wrk_rpt_dt) AS Prior2, 
    lag(dat_sls_wrk_rpt_dt,3)over (partition by DAT_DATE_DT order by dat_sls_wrk_rpt_dt) AS Prior3, 
    lag(dat_sls_wrk_rpt_dt,4)over (partition by DAT_DATE_DT order by dat_sls_wrk_rpt_dt) AS Prior4, 
    lag(dat_sls_wrk_rpt_dt,5)over (partition by DAT_DATE_DT order by dat_sls_wrk_rpt_dt) AS Prior5, 
    lag(dat_sls_wrk_rpt_dt,6)over (partition by DAT_DATE_DT order by dat_sls_wrk_rpt_dt) AS Prior6, 
    lag(dat_sls_wrk_rpt_dt,7)over (partition by DAT_DATE_DT order by dat_sls_wrk_rpt_dt) AS Prior7, 
    RANK 
FROM 
    (SELECT DISTINCT B.DAT_DATE_DT, 
    A.dat_sls_wrk_rpt_dt, 
    dense_rank() over (partition by B.DAT_DATE_DT order by A.dat_sls_wrk_rpt_dt DESC) RANK 
    FROM EWT_DATE_DIM1 A, 
    EWT_DATE_DIM1 B 
    WHERE A.dat_sls_wrk_rpt_dt < B.dat_sls_wrk_rpt_dt 
    AND B.DAT_DATE_DT in (trunc(sysdate-15),trunc(sysdate-16)) 
) 
WHERE RANK <12) 
where RANK=1 
ORDER BY 2 DESC 

Можно ли думать что-то проще, чем это. Поскольку может быть много дат для исторических нагрузок, и я хочу точно настроить это. Кроме того, мне нужно, чтобы это было сделано в информатике.

+0

Это впечатляющий запрос. Это работает? и эффективна ли она? –

ответ

0

Я думаю, что сделаю это с помощью хранимой процедуры для каждой даты интереса. Вы можете запросить запрос, но я не думаю, что он будет очень эффективным. Я не знаком с точным синтаксисом Informatica, но что-то вроде этого:

declare dCursor CURSOR for 
select dat_date_dt, dat_sql_wrk_rpt_dt 
from EWT_DATE_DIM1 
where EWT_DATE_DIM1.DAT < @dt 
order by dat_date_dt desc 

Тогда просто собирать различные значения. Это будет более эффективно, особенно с индексом dat_date_dt

+0

Спасибо, dan..Hmm ... Я искал, чтобы избежать процедур. – user3092765

Смежные вопросы