2016-09-08 2 views
0

Ich habe folgende Abfrage den ersten bevorstehenden Geschäftstermin zu berechnen, die wie folgt aussieht:Minimal- und zweites Minimum in SQL

SELECT LAST_CLOSING_BALANCE_DATES.ACCT_NBR, MIN(BUSINESS_DATES.DATE_VALUE) AS FIRST_BUSINESS_DAY 
FROM BUSINESS_DATES JOIN SD_CALENDAR ON BUSINESS_DATES.CODE = SD_CALENDAR.CODE 
    JOIN AS_AS_RECEPTION_CONF ON AS_AS_RECEPTION_CONF.CALENDAR_ID = SD_CALENDAR.ID 
    JOIN SD_ACCT_GRP ON AS_AS_RECEPTION_CONF.ACCT_GRP_ID = SD_ACCT_GRP.ID 
    JOIN SD_ACCT_GRP_MEMBER ON SD_ACCT_GRP.ID = SD_ACCT_GRP_MEMBER.GRP_ID 
    JOIN SD_ACCT ON SD_ACCT.ID = SD_ACCT_GRP_MEMBER.ACCT_ID 
    JOIN LAST_CLOSING_BALANCE_DATES ON SD_ACCT.ACCT_NBR = LAST_CLOSING_BALANCE_DATES.ACCT_NBR 
WHERE BUSINESS_DATES.DATE_VALUE > LAST_CLOSING_BALANCE_DATES.BAL_DATE 
GROUP BY LAST_CLOSING_BALANCE_DATES.ACCT_NBR 

Jetzt mag ich auch eine Spalte mit dem zweiten kommenden Geschäftstermin. Ich möchte dies in der gleichen SQL-Abfrage. Wie kann ich die minimale und die zweite minimale auswählen?

Antwort

0
Use rownumber with CTE.. 

    ;with cte 
    as 
    (SELECT LAST_CLOSING_BALANCE_DATES.ACCT_NBR, row_number() over (order by BUSINESS_DATES.DATE_VALUE) AS FIRST_BUSINESS_DAY 
    FROM BUSINESS_DATES JOIN SD_CALENDAR ON BUSINESS_DATES.CODE = SD_CALENDAR.CODE 
     JOIN AS_AS_RECEPTION_CONF ON AS_AS_RECEPTION_CONF.CALENDAR_ID = SD_CALENDAR.ID 
     JOIN SD_ACCT_GRP ON AS_AS_RECEPTION_CONF.ACCT_GRP_ID = SD_ACCT_GRP.ID 
     JOIN SD_ACCT_GRP_MEMBER ON SD_ACCT_GRP.ID = SD_ACCT_GRP_MEMBER.GRP_ID 
     JOIN SD_ACCT ON SD_ACCT.ID = SD_ACCT_GRP_MEMBER.ACCT_ID 
     JOIN LAST_CLOSING_BALANCE_DATES ON SD_ACCT.ACCT_NBR = LAST_CLOSING_BALANCE_DATES.ACCT_NBR 
    WHERE BUSINESS_DATES.DATE_VALUE > LAST_CLOSING_BALANCE_DATES.BAL_DATE 
    GROUP BY LAST_CLOSING_BALANCE_DATES.ACCT_NBR 
    ) 
    select ACCT_NBR, 
min(DATE_VALUE) as firstbusiness, 
max(DATE_VALUE)as secondbusiness from cte where rn<=2 
group by ACCT_NBR