Найти тему

MSSQL. Группировка по диапазонам изменений логов (ну или как-то так)

Ну вот опять. Прибежали, перья разбросали, заверещали "как потерпевшие". "Не хотим", кричат, "быть царицами морскими, а хотим знать, значит, что было до того как мы Вовочке 8 марта двойки на пятёрки исправили! Сколько, значит, было двоек до и сколько стало после". И каблучком так изящно топают. А ты, кричат, крутись как хочешь. База-то у тебя до немогу нормализованная, ехидно намекают, и эти исправления выглядят как "8 марта 2020 года МарьИванна исправила 2 на 5".

Речь, конечно, шла не про Вовочку с МарьИванной и не про оценки школьные, но суть ровно та-же самая - изменили дату начала событий разных (скажем, концертов) и интересовало заказчика - сколько было, скажем, продаж до того и сколько было после. К слову, создавать новые события при наступлении часа "Х" заказчик по понятным только ему причинам отказывался. Выглядели исходные данные примерно вот так:

Лог изменений
Лог изменений
Таблица операций
Таблица операций

Чтож.. Как известно, "1. заказчик всегда прав, а если он не прав - смотри пункт 1". А посему, наливаем стаканчик бренди, раскуриваем сигару и начинаем размышлять:

  1. всё, что произошло до первого "изменения" (раньше changeDate первой записи, относящейся к событию id) - является операциями первого события (с датой oldDate)
  2. всё, что произошло после первого "изменения" (позже changeDate первой записи, относящейся к событию id) - является операциями уже второго события (с датой newDate)
  3. всё, что произошло после первого "изменения" (позже changeDate первой записи, относящейся к событию id), но до второго "изменения" (раньше changeDate второй записи, относящейся к событию id)- является операциями второго события (с датой oldDate) и, одновременно, третьего (с датой newDate)

Собственно и весь алгоритм. Сходу, конечно, в голову приходит цикл с описанием условий - что, куда и как.. Который и был, впрочем, реализован (т.к. заказчик бил копытом и гневно фырчал в ухо).. Но, циклы - небезопасны. Посему, раскинув мозгами, получилось реализовать решение на обычных запросах:

Ну и в итоге получаем всё тот-же искомый результат:

Что и требовалось заказчику
Что и требовалось заказчику

Появились вопросы? Задавайте! Появились претензии? Критикуйте! Появились идеи? Предлагайте! ;)