基于最大最小日期的案例陈述

时间:2017-05-22 19:41:32

标签: sql oracle

我有Memnumber, activity type, activity date, activity ID列。一个成员可以在几天后开展活动。我想写一个案例陈述,如果活动日期最初是初始,那么如果活动是最近的那么MR,如果这两个日期之间有任何活动,那么BETWEEN。它们需要按Memnumber和治疗类型分组。

我写的查询为:

--MR County Tree
SELECT T0.MEMBERNUMBER,
    T0.ACTIVITYTYPE,
    T1.MR_CY17,
    T1.IN_CY17,
    T0.ACTIVITY_DATE,
    (T0.ACTIVITYID)
FROM DLA_EXTRACT_FINAL T0
INNER JOIN (
    SELECT MEMBERNUMBER,
        ACTIVITYTYPE,
        MAX(ACTIVITY_DATE) MR_CY17,
        MIN(ACTIVITY_DATE) IN_CY17
    FROM DLA20_EXTRACT_FINAL
    WHERE to_char(ACTIVITY_DATE, 'YYYYMMDD') >= 20170101
        AND to_char(ACTIVITY_DATE, 'YYYYMMDD') <= 20171231
    GROUP BY MEMBERNUMBER,
        ACTIVITYTYPE
    ) T1 ON T0.MEMBERNUMBER = T1.MEMBERNUMBER
    AND T0.ACTIVITYTYPE = T1.ACTIVITYTYPE
    AND T0.ACTIVITY_DATE = T1.MR_CY17
--where  T0.ACTIVITYTYPE='MT'
WHERE t0.MEMBERNUMBER = 'M500085268'
GROUP BY T0.MEMBERNUMBER,
    T0.ACTIVITYTYPE,
    T1.MR_CY17,
    T1.IN_CY17,
    T0.ACTIVITYID,
    T0.ACTIVITY_DATE
ORDER BY T0.MEMBERNUMBER,
    T0.ACTIVITYTYPE,
    T1.MR_CY17,
    T1.IN_CY17.

寻找解决方案。

1 个答案:

答案 0 :(得分:1)

您想使用窗口功能。类似的东西:

SELECT T0.MEMBERNUMBER,
    T0.ACTIVITYTYPE,
    T0.ACTIVITY_DATE,
    T0.ACTIVITYID,
    case when row_number() over (partition by T0.MEMBERNUMBER, T0.ACTIVITYTYPE
        order by T0.ACTIVITY_DATE) = 1 then 1 else 0 end most_initial,
    case when row_number() over (partition by T0.MEMBERNUMBER, T0.ACTIVITYTYPE
        order by T0.ACTIVITY_DATE desc) = 1 then 1 else 0 end most_recent
FROM DLA_EXTRACT_FINAL T0

然后,如果most_intial = 1,则可以使用case语句标记为INITIAL,如果most_recent = 1则使用MR标记,如果两者都为0,则使用BETWEEN。