Разница в датах в одном столбце MSSQL

Есть следующие данные

id  data
1   01.12.2021
2   03.12.2021
3   05.12.2021
4   12.12.2021
5   15.12.2021

Необходимо оставить только те id , между которыми не менее 10 дней. То есть на выходе должно остаться

id  data
1   01.12.2021
4   12.12.2021

Я попробовал через LAG и DateDiff, но они сравнивают только попарно значения друг за другом. Поэтому между id3 и id4 всего 7 дней. И обе строчки убираются. Но между id1 и id4 11 дней и условие выполняется. Но код эту строчку вычеркивает. Подскажите, через какие другие функции можно решить данную задачу ?


Ответы (2 шт):

Автор решения: Akina
WITH cte AS (
    SELECT MIN(date0) date0
    FROM test
    UNION ALL
    SELECT t1.date0
    FROM test t1
    JOIN cte ON t1.date0 >= DATEADD(day, 10, cte.date0)
    WHERE NOT EXISTS ( SELECT NULL
                       FROM test t2
                       WHERE t2.date0 >= DATEADD(day, 10, cte.date0)
                         AND t1.date0 > t2.date0 )
)
SELECT test.* 
FROM test
JOIN cte ON test.date0 = cte.date0;

fiddle

PS. Решение предполагает, что поле date0 уникально.

→ Ссылка
Автор решения: nempyxa

Таблица table1 состоит из двух колонок: id, dat (типа DATE)

Такой запрос даст все возможные варианты:

select a.id,a.dat,b.id,b.dat from table1 a, table1 b
where DATE_ADD(a.dat, INTERVAL 10 DAY) < b.dat

Получим:

"1" "2021-12-01"    "4" "2021-12-12"
"1" "2021-12-01"    "5" "2021-12-15"
"2" "2021-12-03"    "5" "2021-12-15"

Теперь берем только одну пару дат и формируем результат именно как запрошено:

select a.* from table1 a, table1 b 
where date_add(a.dat, INTERVAL 10 DAY) < b.dat limit 1
union all
select d.* from table1 c, table1 d
where date_add(c.dat, INTERVAL 10 DAY) < d.dat limit 2

Получаем:

"1" "2021-12-01"
"4" "2021-12-12"
→ Ссылка