Я запускаю эту проблему на сервере SQL
Вот моя проблема.
есть что-то вроде этого
Dataset A
FK_ID StartDate EndDate Type
1 10/1/2018 11/30/2018 M
1 12/1/2018 2/28/2019 N
1 3/1/2019 10/31/2019 M
У меня есть второй источник данных у меня нетуправление данными примерно таким образом:
Dataset B
FK_ID SpanStart SpanEnd Type
1 10/1/2018 10/15/2018 M
1 10/1/2018 10/25/2018 M
1 2/15/2019 4/30/2019 M
1 5/1/2019 10/31/2019 M
Я пытаюсь проверить, чтобы каждая дата в каждой записи TYPE M в наборе данных A имела как минимум 1 запись в наборе данных B.
Например, запись 1 в наборе данных A НЕ имеет покрытия с 26.10.2016 по 30.11.2008. Меня действительно волнует только когда закончится покрытие, в этом случае я хочу вернуться 26.10.2008, потому что это первая дата, когда диапазон не имеет покрытия из набора данных B.
Я написал функциюэто делает это, но это довольно медленно, потому что он циклически перебирает каждую дату в каждой M-записи и подсчитывает количество записей в наборе данных B. Он выходит из цикла, когда находит первую, но я действительно хотел бы сделать это более эффективным. Я уверен, что не думаю об этом должным образом, поэтому любые предложения, которые кто-либо может предложить, были бы полезны.
Это раздел кода, который я сейчас выполняю
else if @SpanType = 'M'
begin
set @CurrDate = @SpanStart
set @UncovDays = 0
while @CurrDate <= @SpanEnd
Begin
if (SELECT count(*)
FROM eligiblecoverage ec join eligibilityplan ep on ec.plandescription = ep.planname
WHERE ec.masterindividualid = @IndID
and ec.planbegindate <= @CurrDate and ec.planenddate >= @CurrDate
and ec.sourcecreateddate = @MaxDate
and ep.medicaidcoverage = 1) = 0
begin
SET @Result = concat('NON Starting ',format(@currdate, 'M/d/yyyy'))
BREAK
end
set @CurrDate = @CurrDate + 1
end
end
Я не женатчтобы иметь функцию, он просто не мог найти способ сделать это в запросах, которые были не очень-очень медленными.
РЕДАКТИРОВАТЬ: Набор данных B будет никогда не иметь никаких типов, кроме M, так чтоне учитывается
РЕДАКТИРОВАТЬ 2: Код, предлагаемый DonPablo, де-перекрывает данные, но только в тех случаях, когда есть совпадение вообще. Он уменьшает набор данных B до:
FK_ID SpanStart SpanEnd Type
1 10/1/2018 10/25/2018 M
вместо
FK_ID SpanStart SpanEnd Type
1 10/1/2018 10/25/2018 M
1 2/15/2019 4/30/2019 M
1 5/1/2019 10/31/2019 M
Я все еще спорю с этим, но это начало.