我有一个成员及其 claim 值(value)表,我有兴趣获取每个成员前 3 个月的 claim 值(value)。这是我到目前为止所尝试过的:
WITH START as
(SELECT [HEALTH_ID]
,MIN([CLM_MONTH]) as DOS
FROM [TEST]
GROUP BY
[HEALTH_PLAN_ID])
SELECT HEALTH_ID
,DOS
,FORMAT(DATEADD(month, +1, DOS), 'MM/dd/yyyy')
,FORMAT(DATEADD(month, +2, DOS), 'MM/dd/yyyy')
FROM START
我的计划是获取 claim 前 3 个月的日期,然后将 claim 金额加入 ID 和日期。这里的问题是并不是每个成员都连续几个月有 claim ,而 dateadd 函数给了我连续几个月。例如,如果成员(member)在一月、二月、四月、五月等有 claim ...我对一月、二月和四月的 claim 感兴趣,因为三月没有 claim 。使用 dateadd 函数会给我日期 1 月、2 月、3 月(不包括 4 月)。
总之,我需要帮助获取具有 claim 值(value)的前 3 个月(月份可能连续也可能不连续)。
最佳答案
使用dense_rank()
对按 Health_Id
分区的月份进行排名,以便过滤每个 Health_Id
的前三个月。
;with cte as (
select *
, dr = dense_rank() over (
partition by Health_ID
order by dateadd(month, datediff(month, 0, CLM_Month) , 0) /* truncate to month */
)
from test
)
select *
from cte
where dr < 4 -- dense rank of 1-3
测试数据:
create table test (health_id int, clm_month date)
insert into test values
(1,'20170101'),(1,'20170201'),(1,'20170301'),(1,'20170401')
,(2,'20170101'),(2,'20170201'),(2,'20170401'),(2,'20170501') -- no March
,(3,'20170101'),(3,'20170115'),(3,'20170201'),(3,'20170215') -- Multiple per month
,(3,'20170401'),(3,'20170415'),(3,'20170501'),(3,'20170515')
rextester 演示:http://rextester.com/MTZ16877
返回:
+-----------+------------+----+
| health_id | clm_month | dr |
+-----------+------------+----+
| 1 | 2017-01-01 | 1 |
| 1 | 2017-02-01 | 2 |
| 1 | 2017-03-01 | 3 |
| 2 | 2017-01-01 | 1 |
| 2 | 2017-02-01 | 2 |
| 2 | 2017-04-01 | 3 |
| 3 | 2017-01-01 | 1 |
| 3 | 2017-01-15 | 1 |
| 3 | 2017-02-01 | 2 |
| 3 | 2017-02-15 | 2 |
| 3 | 2017-04-01 | 3 |
| 3 | 2017-04-15 | 3 |
+-----------+------------+----+
关于sql - 获取有 claim 的前 3 个月的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46568881/