如何在SQL中的表中获取一个日期的最大值

问题描述

我写了下面的代码-

select 
        PAPF.PERSON_NUMBER,BP.NAME                                       BENEFIT_PLAN,BBR.BENEFIT_RELATION_NAME,Round(BPER.BNFT_AMT,2) * 100                 COVERAGE_AMOUNT,TO_CHAR(BPER.ENRT_CVG_STRT_DT,'YYYYMMDD')    ENROLMENTCOvstaRTDATE
        TO_CHAR(BPER.ENRT_CVG_THRU_DT,'YYYYMMDD')    ENROLMENTCOVSENDDATE
FROM    PER_ALL_PEOPLE_F               PAPF,BEN_PRTT_ENRT_RSLT             BPER,BEN_PL_F                       BP,BEN_BENEFIT_RELATIONS_F        BBR
        WHERE PAPF.PERSON_ID               = BPER.PERSON_ID 
        AND     BPER.PL_ID                   = BP.PL_ID 
        AND     BBR.PERSON_ID                = PAPF.PERSON_ID 
AND     BBR.BENEFIT_RELATION_NAME    = 'DFLT'
AND     SYSDATE BETWEEN PAPF.EFFECTIVE_START_DATE AND PAPF.EFFECTIVE_END_DATE 
AND     SYSDATE BETWEEN BP.EFFECTIVE_START_DATE   AND BP.EFFECTIVE_END_DATE 
AND     SYSDATE BETWEEN BBR.EFFECTIVE_START_DATE  AND BBR.EFFECTIVE_END_DATE 

这将给我类似-

输出
PErson_number           BENEFIT_PLAN                COVERAGE_AMOUNT  ENROLMENTCOvstaRTDATE          ENROLMENTCOVSENDDATE    
1010                    US Basic PLAN               20000               20200901                    20201020
1010                    US Basic PLAN               20000               20201021                    

1011                    Us Spouse PLAN              160000              20200901                    20201020
1011                    Us Spouse PLAN              160000              20201021                    47121231

我只想为每个人检索ENROLMENTCOvstaRTDATE的最大值。预期输出应为-

PErson_number           BENEFIT_PLAN                COVERAGE_AMOUNT  ENROLMENTCOvstaRTDATE          ENROLMENTCOVSENDDATE    
1010                    US Basic PLAN               20000               20201021                    

1011                    Us Spouse PLAN              160000              20201021                    20201220

如何在主要查询中使用Max?

解决方法

首先按每人的ENRT_CVG_STRT_DT对行进行排名(假定由PAPF.PERSON_NUMBER标识)。然后过滤顶部的行。

select person_number,name,BENEFIT_PLAN,BENEFIT_RELATION_NAME,COVERAGE_AMOUNT,ENROLMENTCOVSTARTDATE,ENROLMENTCOVSENDDATE
from (
select 
        PAPF.PERSON_NUMBER,BP.NAME                                       BENEFIT_PLAN,BBR.BENEFIT_RELATION_NAME,Round(BPER.BNFT_AMT,2) * 100                 COVERAGE_AMOUNT,TO_CHAR(BPER.ENRT_CVG_STRT_DT,'YYYYMMDD')    ENROLMENTCOVSTARTDATE,TO_CHAR(BPER.ENRT_CVG_THRU_DT,'YYYYMMDD')    ENROLMENTCOVSENDDATE,row_number() over (partition by PAPF.PERSON_NUMBER order by BPER.ENRT_CVG_STRT_DT desc) rn 
        from    
FROM    PER_ALL_PEOPLE_F               PAPF,BEN_PRTT_ENRT_RSLT             BPER,BEN_PL_F                       BP,BEN_BENEFIT_RELATIONS_F        BBR
        WHERE PAPF.PERSON_ID               = BPER.PERSON_ID 
        AND     BPER.PL_ID                   = BP.PL_ID 
        AND     BBR.PERSON_ID                = PAPF.PERSON_ID 
AND     BBR.BENEFIT_RELATION_NAME    = 'DFLT'
AND     SYSDATE BETWEEN PAPF.EFFECTIVE_START_DATE AND PAPF.EFFECTIVE_END_DATE 
AND     SYSDATE BETWEEN BP.EFFECTIVE_START_DATE   AND BP.EFFECTIVE_END_DATE 
AND     SYSDATE BETWEEN BBR.EFFECTIVE_START_DATE  AND BBR.EFFECTIVE_END_DATE 
)
where rn = 1

如果您想接受并列第一名,则可以将row_number更改为rank / dense_rank(如果您对rn = 1进行过滤则没有关系)。有人会假设每个ENROLMENTCOVSTARTDATE每人只有一行。