Разница в датах в одном столбце 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 шт):
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;
PS. Решение предполагает, что поле date0 уникально.
Таблица 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"