Найти пропущенную запись в диапазоне дат - PullRequest
0 голосов
/ 22 января 2020

В конце огромной хранимой процедуры (на SQL сервере) я создал два CTE. Один с некоторыми диапазонами дат (с интервалом в 6 месяцев) и один с несколькими записями. Предположим, у меня есть диапазоны дат в таблице B с 2020-01-01 по 2010-01-01 (с 6-месячным интервалом)

Start        End
----------------------
2020-01-01 | 2020-07-01
...     ...
other years here
...     ...
2010-01-01 | 2010-07-01

и в таблице A эта ситуация:

Name     Date
-----------------
John    2020-01-01
John    2019-01-01
John    2018-07-01
...     ...
Rob     2020-01-01
Rob     2019-07-01
Rob     2018-07-01
...     ...

Я пытаюсь создать такой набор записей:

Name   MissingDate
-----------------
John    2019-07-01
...     ...
John    2010-01-01

Rob     2019-01-01
...     ...
Rob     2010-01-01

У меня грипп, и я почти не знаю, кто я на данный момент, я надеюсь, что это было ясно, и если кто-нибудь сможет мне помочь с этим я был бы очень признателен.

1 Ответ

0 голосов
/ 22 января 2020

Если вы хотите, чтобы отсутствующие даты (которые, по-видимому, были по месяцам), то сгенерируйте все доступные даты и выньте те, которые у вас есть.

with cte as (
      select start, end
      from dateranges
      union all
      select dateadd(month, 1, start), end
      from cte
      where start < end
    )
select n.name, cte.start
from cte cross join
     (select distinct name from tablea) n left join
     tablea a
     on a.date = cte.start and a.name = n.name
where a.date is null;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...