【问题标题】:SQL: Returning date spans with gapsSQL:返回日期跨度有间隙
【发布时间】:2018-11-28 20:42:52
【问题描述】:

我在一家健康保险公司工作,正在尝试创建一个查询,以输出成员的资格范围。源表列出了成员有资格获得的所有月份的历史日期,每月一次。例如,如果成员 55555 从 2018 年 1 月 15 日至 2018 年 5 月 15 日符合条件,则将有五个条目。

如果不是因为资格差距,这将很容易解决(有一个最小值和最大值),所以这使得它变得更加棘手。理想情况下,我希望每个成员都有一个单独的行,其中包含他们的资格开始和结束日期。因此,如果前一个成员的资格跨度在 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)

有没有办法以所需的方式恢复资格日期?

谢谢

比利

【问题讨论】:

  • 如果 Start_Date 每天变化会怎样?很容易假设任何一个月的第 15 天在这里很重要。为什么是每个月的 15 号而不是 1 号或最后一天?
  • 这是一项具有挑战性的工作,直到您了解您真正想要在这里做什么。幸运的是,Jeff Moden 有一篇很棒的文章讨论了连续日期的岛屿分组。您只需要修改它,以便连续日期是几个月而不是几天。 sqlservercentral.com/articles/T-SQL/71550
  • 谷歌SQL gaps and islands problem..会有很多例子。
  • 这个数据存储在哪里? “因此,如果先前的成员有一个资格跨度,该跨度在 7 月恢复并一直持续到 8 月,则应该返回两行......”在 Gaps 表中给出 2 个示例和预期输出?

标签: sql sql-server gaps-and-islands


【解决方案1】:

这不是一个特别难的问题。这是一个非常简单的解决方案:

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() 之类的函数可以轻松解决此问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 2015-03-13
    • 2013-02-19
    • 2021-08-03
    相关资源
    最近更新 更多