Изобразите билеты службы поддержки, которые передаются между отделами. Мы хотим знать, какой отдел находится в конце дня для каждого билета на каждый день, когда билет открыт. Таблица содержит последний отдел для каждого билета за каждый день, в который он открыт, в который происходит изменение в отделе (включая строку для даты, когда билет был первоначально открыт, и даты, когда он был закрыт). Таблица данных выглядит следующим образом:
CREATE TABLE TicketAssigment (
TicketId INT NOT NULL,
AssignedDate DATE NOT NULL,
DepartmentId INT NOT NULL);
Мне нужно заполнить все пропущенные даты для каждого TicketId, используя DepartmentId из предыдущей строки TicketAssigment, упорядоченной по Date.
Если у меня есть строки TicketAssigment, как это:
1, '1/1/2016', 123 -- Opened
1, '1,4,2016', 456 -- Transferred and closed
2, '1/1/2016', 25 -- Opened
2, '1/2/2016', 52 -- Transferred
2, '1/4/2016', 25 -- Transferred and closed
Я хочу этот вывод:
1, '1/1/2016', 123
1, '1/2/2016', 123
1, '1/3/2016', 123
1, '1/4/2016', 456
2, '1/1/2016', 25
2, '1/2/2016', 52
2, '1/3/2016', 52
2, '1/4/2016', 25
Похоже, что это может быть близко к тому, что мне нужно, но у меня не хватило терпения дать ему закончить, и ориентировочная стоимость плана имеет 6 цифр:
SELECT l.TicketId, c.Date, MIN(l.DepartmentId)
FROM dbo.Calendar c
OUTER APPLY (SELECT TOP 1 TicketId, DepartmentId FROM TicketAssigment WHERE AssignedDate <= c.Date ORDER BY AssignedDate DESC) l
WHERE c.Date <= (SELECT MAX(AssignedDate) FROM TicketAssigment)
GROUP BY l.TicketId, c.Date
ORDER BY l.TicketId, c.Date;
Я подозреваю, что есть способ сделать это, используя LAG и оконную раму, но я не совсем понял это. Что является более эффективным способом удовлетворения требования?
источник