Picture ticket dell'help desk che vengono trasferiti tra i reparti. Vogliamo sapere quale sia il dipartimento alla fine della giornata per ogni biglietto per ogni giorno in cui il biglietto è aperto. La tabella contiene l'ultimo dipartimento per ogni biglietto per ogni giorno in cui è aperto in cui si verifica una modifica nel dipartimento (inclusa una riga per la data di apertura iniziale del biglietto e la data di chiusura). La tabella dei dati è simile alla seguente:
CREATE TABLE TicketAssigment (
TicketId INT NOT NULL,
AssignedDate DATE NOT NULL,
DepartmentId INT NOT NULL);
Ciò di cui ho bisogno è di inserire eventuali date mancanti per ciascun TicketId, utilizzando il DepartmentId della precedente riga TicketAssigment ordinata per Data.
Se ho righe TicketAssigment come questa:
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
Voglio questo risultato:
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
Sembra che potrebbe essere vicino a ciò di cui ho bisogno, ma non ho avuto la pazienza di lasciarlo finire e il costo del piano stimato ha 6 cifre:
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;
Ho il sospetto che ci sia un modo per farlo usando LAG e un telaio di una finestra, ma non l'ho ancora capito. Qual è un modo più efficiente per soddisfare il requisito?