【问题标题】:How can I find the status in each month using a start and end date?如何使用开始和结束日期查找每个月的状态?
【发布时间】:2020-12-02 21:48:17
【问题描述】:

[标题是:“找出事实:如何在医疗保健组织中找到每月明智的活跃成员,并找出增长百分比”]

我有 5 年的历史数据,想对其进行一些分析。数据将包含活动和非活动成员数据。要求是每年每个月查找活跃成员。

我正在做的是从有效数据中提取月份和年份,并根据活动状态按月份和年份分组,即 Status ='Active'

但是以这种方式我正在丢失历史记录。 例如,如果一个人的会员资格从 01-01-2015 到 31-12-2016。此成员现在将显示为非活动成员,但同一个人在此期间是活动成员。所以如果我过滤状态,我会丢失这些旧记录。

我需要去那个月,即 2015 年 1 月,检查当时所有活跃的人。所以我想到了另一种方式。

我已经提取了到期日期的月份并过滤了 exp_month 等于或大于提取的生效日期月份,如下所示。在这里,我不依赖包含成员状态的传入源字段。我正在创建一个具有逻辑的字段,以在我们查找的期间识别成员的状态。这只是为了确定每年每个月的活跃成员但我不确定这是否给了我完美的解决方案。请建议我更好的方法。

    SELECT extract(YEAR FROM member_effective_date)   AS year
         , extract(MONTH FROM member_expiry_date)     AS month
         , CASE WHEN extract(MONTH FROM member_expiry_date) 
                     = extract(MONTH FROM member_effective_date) 
                  OR extract(MONTH FROM member_expiry_date) 
                     > extract(MONTH FROM member_effective_date) 
                THEN 'Yes'
           ELSE 'No' END                              AS active_status
    FROM table_name

【问题讨论】:

    标签: amazon-redshift oracle-sqldeveloper tableau-api analytics amazon-quicksight


    【解决方案1】:

    您需要使用带有日期表的交叉联接来获取每个时期的状态。交叉连接“膨胀”了状态表,因此您可以评估每个时期的状态。

    这是一个例子:

        CREATE TEMP TABLE table_name AS
        SELECT 'member1'          AS member
             , '2020-01-01'::DATE AS member_effective_date
             , '2020-04-27'::DATE AS member_expiry_date
        ;
    
        WITH month_list 
            -- Month start and end for previous 12 months
        AS (SELECT DATE_TRUNC('month',dt) AS month_start
                 , MAX(dt)                AS month_end
            FROM 
                 -- List of the previous 365 dates
                 (SELECT DATE_TRUNC('day',SYSDATE)  - (n * INTERVAL '1 day') AS dt
                  FROM 
                       -- List of numbers from 1 to 365
                       (SELECT ROW_NUMBER() OVER () AS n FROM stl_scan LIMIT 365) )
            GROUP BY month_start
        )
        SELECT extract(YEAR  FROM b.month_start) AS year
             , extract(MONTH FROM b.month_start) AS month
             , CASE WHEN -- Effective before the month ended and 
                         (a.member_effective_date <= b.month_end
                     AND  a.member_expiry_date > b.month_start) 
                    THEN 'Yes'
               ELSE 'No' END                              AS active
        FROM table_name a
        CROSS JOIN month_list b -- Explicit cartesian product
        ORDER BY 1,2
        ;
    
    | year | month | active|
    |------|-------|-------|
    | 2019 |     8 | No    |
    | 2019 |     9 | No    |
    | 2019 |    10 | No    |
    | 2019 |    11 | No    |
    | 2019 |    12 | No    |
    | 2020 |     1 | Yes   |
    | 2020 |     2 | Yes   |
    | 2020 |     3 | Yes   |
    | 2020 |     4 | Yes   |
    | 2020 |     5 | No    |
    | 2020 |     6 | No    |
    | 2020 |     7 | No    |
    | 2020 |     8 | No    |
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2019-02-25
      • 2018-07-24
      • 2012-05-31
      • 1970-01-01
      • 2021-09-26
      相关资源
      最近更新 更多