Сегодня устраиваемся в телеком-команию :-)
Без лишних прелюдий — сразу к условию задачи
Существует таблица абонентов appn_history с историей изменений. Каждая запись по абоненту действует в пределах периода c valid_from_dt по valid_to_dt. По каждому абоненту, в каждый момент времени, должна быть только одна действующая запись.
Необходимо написать запрос, отбирающий записи, которые нарушают условие хранения данных в таблице.
Решение
Запрос должен выявить те случаи, когда для одного абонента существует несколько записей, которые действуют одновременно, то есть пересекаются по временным интервалам valid_from_dt и valid_to_dt.
Вот пример запроса, который делает это
SELECT
a1.subscriber_id,
a1.valid_from_dt,
a1.valid_to_dt,
a2.valid_from_dt AS conflicting_valid_from_dt,
a2.valid_to_dt AS conflicting_valid_to_dt
FROM
appn_history a1
JOIN
appn_history a2
ON
a1.subscriber_id = a2.subscriber_id
AND a1.id <> a2.id -- исключаем сравнение с самой собой
AND a1.valid_from_dt < a2.valid_to_dt
AND a1.valid_to_dt > a2.valid_from_dt
ORDER BY
a1.subscriber_id, a1.valid_from_dt;
Делитесь своими решениями в комментариях или присылайте интересные тестовые, чтобы мы разобрали их в следующих публикациях.
#разбор_тестового
@leftjoin_career


