sql - 获取有 claim 的前 3 个月的数据

标签 sql sql-server

我有一个成员及其 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/

相关文章:

sql - 是否可以在不使用group by子句的情况下计算表中每个组的总和

sql - 在 CLI 中设置 Sequelize 模型主键类型

sql - 由第三列分组的另一列上不同行内列 = A 的行的平均值

mysql - SQL 子查询和 ORDER BY

mysql - 如何从 mysql 连接接收 1 行而不是 4 行

asp.net - 防止用户在同一行上工作

SQL Server 如何获取每个类别下的新闻数量

sql-server - SQL Server 数据补丁,用于将中间的 2 个双引号替换为单个双引号

sql-server - 外键创建失败

sql - 一个数据库用于一个客户或一个用于所有客户