2017-02-15 6 views
0

Я пытаюсь вернуть деталь на каждый день, но только детали, связанные с максимальным ID_EXECN для каждого дня. Вот мой код:sql oracle - дни возврата с максимальным значением за каждый день

SELECT 
T1.ID_EXECN,  
T1.DT_HDG_EFF, 
T1.ID_DERIV,  
T1.CUSIP   

FROM  
(SELECT 
he.ID_EXECN,  
he.DT_HDG_EFF, 
d.ID_DERIV,  
d.ID_CUSIP AS CUSIP  
FROM  
(hdvsudbr.deriv_popltn d 
INNER JOIN hdvsudbr.hdg_execn_job_deriv_popltn jdp   
ON jdp.ID_DERIV = d.ID_DERIV  
INNER JOIN hdvsudbr.hdg_execn_job hej  
ON hej.ID_JOB = jdp.ID_JOB   
INNER JOIN hdvsudbr.hdg_execn he   
ON he.ID_EXECN = hej.ID_EXECN) 

WHERE hej.CD_JOB_TYPE = 9 
AND he.DT_HDG_EFF >=LAST_DAY(ADD_MONTHS(SYSDATE,-5))) T1 

Мой текущий результат выглядит следующим образом:

Несколько дней там более одного ID_EXECN (два, три или более) и несколько дней есть только один ID_EXECN, так max в дни, где есть, нужно просто вернуть тот же самый.

ID_EXECN  DT_HDG_EFF ID_DERV CUSIP 
40   11/8/2016 1  Z800 
40   11/8/2016 2  Z801 
41   11/8/2016 1  Z800 
41   11/8/2016 2  Z801 
22   11/9/2016 1  Z800 
22   11/9/2016 2  Z801 
23   11/9/2016 1  Z800 
23   11/9/2016 2  Z801 
24   11/9/2016 1  Z800 
24   11/9/2016 2  Z801 
10   11/10/2016 1  Z800 
10   11/10/2016 2  Z801 

Это выход я пытаюсь получить, только записи с максимальным ID_EXECN для данного дня:

ID_EXECN  DT_HDG_EFF ID_DERV CUSIP 
41   11/8/2016 1  Z800 
41   11/8/2016 2  Z801 
24   11/9/2016 1  Z800 
24   11/9/2016 2  Z801 
10   11/10/2016 1  Z800 
10   11/10/2016 2  Z801 

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

ответ

0

Вы могли бы вы оконную функцию RANK для этого:

select T1.ID_EXECN, 
    T1.DT_HDG_EFF, 
    T1.ID_DERIV, 
    T1.CUSIP 
from (
    select he.ID_EXECN, 
     he.DT_HDG_EFF, 
     d.ID_DERIV, 
     d.ID_CUSIP as CUSIP rank() over (
      partition by he.DT_HDG_EFF order by he.ID_EXECN desc nulls last 
      ) rnk 
    from (
     hdvsudbr.deriv_popltn d inner join hdvsudbr.hdg_execn_job_deriv_popltn jdp on jdp.ID_DERIV = d.ID_DERIV 
     inner join hdvsudbr.hdg_execn_job hej on hej.ID_JOB = jdp.ID_JOB 
     inner join hdvsudbr.hdg_execn he on he.ID_EXECN = hej.ID_EXECN 
     ) 
    where hej.CD_JOB_TYPE = 9 
     and he.DT_HDG_EFF >= LAST_DAY(ADD_MONTHS(SYSDATE, - 5)) 
    ) T1 
where rnk = 1 
0

Это работает, просто нужно, после Cusip

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

  • Нет связанных вопросов^_^