我在一家健康保险公司工作,并且正在尝试创建一个查询,以输出成员的资格范围。源表列出了会员每月有资格获得的所有月份的历史日期。例如,如果成员55555符合01/15 / 2018-05 / 15/2018的资格,则将有五个条目。
如果不是针对资格的差距,这将很容易解决(带有最小和最大),因此变得棘手。理想情况下,我想为每个成员单独列出其资格的开始和结束日期。因此,如果前任成员的素养范围在7月回升到8月,则应该返回两行:
Member_Nbr Start_Date End_Date
55555 01/15/2018 05/15/2018
55555 07/15/2018 08/15/2018
----------Sample Dataset:
create table #gaps (member_nbr varchar(5),membership_date date)
insert into #gaps(member_nbr,membership_date)
values ('55555','01/15/2018'),('55555','02/15/2018'),('55555','03/15/2018'),
('55555','04/15/2018'),('55555','05/15/2018'),('55555','07/15/2018'),
('55555','08/15/2018')
----------Without Gaps
select member_nbr,min(membership_date),max(membership_date)
from #gaps
group by member_nbr
order by member_nbr
----------With Gaps (desired output)
有没有一种方法可以按期望的方式恢复资格日期?
谢谢
比利
答案 0 :(得分:0)
这不是一个特别困难的问题。这是一个非常简单的解决方案:
select member_nbr, min(membership_date), max(membership_date)
from (select g.*, row_number() over (partition by member_nbr order by membership_date) as seqnum
from gaps g
) g
group by member_nbr, dateadd(month, - seqnum, membership_date);
以及db<>fiddle。
这个想法很简单。如果您有一个日期并减去一系列的月数,那么对于一系列相邻的月,结果是恒定的。所以:
2018-02-15 1 2018-01-15
2018-03-15 2 2018-01-15
2018-04-15 3 2018-01-15
2018-07-15 4 2018-03-15
2018-08-15 5 2018-03-15
2018-11-15 6 2018-05-15
最后一列用于汇总。
日期不全是15日会引起问题。使用eomonth()
之类的函数可以轻松解决该问题。