如何使用开始和结束日期查找每个月的状态?

问题描述

[标题是:“发现事实:如何每年在医疗保健组织中查找按月活跃的成员,以及如何找到增长百分比” ]

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

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

但是以这种方式,我丢失了历史记录。 例如,某人的会员资格为2015年1月1日至2016年12月31日。该成员现在将显示为非活动成员,但在此期间同一个人是活动成员。因此,如果我按状态进行过滤,则会丢失这些旧记录。

我需要去那个月,即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

解决方法

您需要使用带有日期表的交叉联接来获取每个期间的状态。交叉联接会“夸大”状态表,以便您可以评估每个期间的状态。

这里是一个例子:

    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    |

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...