sql oracle - 返回每天最大值的天数

时间:2017-02-15 18:33:19

标签: sql oracle greatest-n-per-group

我正在尝试返回每天的详细信息,但只返回与每天的最大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的最大天数应该只返回相同的一个。

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,但这不是我想要的。我想要每天的最大值。其他情况我的查询运行,但只返回任何内容。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这可行,只需要一个,在CUSIP之后