SQL Server: упаковываем интервалы с приоритетами. Шаг 2. Продолжение
Столбец endpty
Если текущее событие начала или завершения заканчивает результирующий интервал, то столбец endpty возвращает приоритет этого интервала, в противном случае — NULL.
Одно условие, которое делает текущее событие концом результирующего интервала: событие является событием завершения (type = —1) и отсутствуют оставшиеся активные интервалы (rsb = 0) или самый высокий оставшийся активный приоритет ниже, чем приоритет только что завершившегося интервала (номер больше: rsb > -ptybitval). В этом случае endpty устанавливается равным pty (приоритет текущего события). Примеры таких событий: событие завершения для User2 в 10:30 интервала с приоритетом 3 и событие завершения для User2 в 9:30 интервала с приоритетом 1.
Другое условие, которое делает текущее событие концом результирующего интервала: событие представляет собой событие начала (type = 1), а самый высокий активный приоритет перед применением текущего события ниже, чем приоритет текущего события (номер больше: prvrsb > ptybitval). Например, в 9:00 начинается упакованный интервал для User2 с приоритетом 1. Это указывает на конец выходного интервала с приоритетом 2.
Если вы дошли до этого места и поняли все, что написано выше, то я вас поздравляю. Можете перейти от кофе к чему-нибудь покрепче.
Шаг 3
Шаг 3 довольно простой. Взглянув на результат шага 2 в таблице 3, необходимо выполнить следующие действия:
1. Разделить значения startpty и endpty на отдельные строки.
2. Удалить все строки, в которых startpty и endpty имеют значение NULL.
Вы можете выполнить оба действия, применив оператор UNPIVOT к результатам предыдущего шага, например:
UNPIVOT (newpty FOR newtype IN (startpty, endpty)) AS UЗатем нужно создать идентификатор результирующего интервала (назовем его grp) для каждой последовательной пары событий с одинаковыми пользователем и приоритетом. Для этого следует воспользоваться номером строки (назовем его rn) в следующей формуле: (rn — 1)/2 + 1. Ниже приведено выражение T-SQL:
(ROW_NUMBER () OVER (PARTITION BY username, newpty ORDER BY ts) -1)/2 +1 AS grpВ коде выше представлен полный программный код шага 3, а в таблице 4 содержатся выходные данные этого шага.