sql oracle - return 天,每天都有最大值

sql oracle - return days with max value for each day

我正在尝试 return 每天的详细信息,但仅与每天的最大值 ID_EXECN 关联的详细信息。这是我的代码:

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,所以只有一个的日子的最大值应该 ID_EXECN =30=]同一个

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,但这不是我想要的。我想要每天的最大值。其他情况下我的查询运行,但只是 return 什么都没有。

您可以 window 函数 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

这有效,只需要在 CUSIP

之后