SQL: возвращаемая дата охватывает пробелы - PullRequest
0 голосов
/ 28 ноября 2018

Я работаю в медицинской страховой компании и пытаюсь создать запрос, который выводит данные о допустимых пределах для участников.В исходной таблице перечислены исторические даты всех месяцев, на которые участник имеет право, один раз в месяц.Например, если член 55555 подходит с 01/15/2018-05 / 15/2018, будет пять записей.

Это было бы легко решить (с минимальным и максимальным значением), если бы недля пробелов в праве, так что это делает его сложнее.В идеале мне бы хотелось иметь отдельную строку для каждого участника с указанием даты его начала и окончания.Таким образом, если предыдущий член имел право на участие в программе, которое восстановилось в июле и продолжалось до августа, должно быть возвращено две строки:

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)

Есть ли способ вернуть даты приемлемости желаемым способом?

Спасибо

Билли

1 Ответ

0 голосов
/ 29 ноября 2018

Это не особенно сложная проблема.Вот довольно простое решение:

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().

...