问题描述
[标题是:“发现事实:如何每年在医疗保健组织中查找按月活跃的成员,以及如何找到增长百分比” ]
我有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 |