Picture tickets de la mesa de ayuda que se transfieren entre departamentos. Queremos saber cuál es el departamento al final del día para cada boleto por cada día que el boleto está abierto. La tabla contiene el último departamento para cada ticket para cada día que está abierto en el que hay un cambio en el departamento (incluida una fila para la fecha en que el ticket se abrió inicialmente y la fecha en que se cerró). La tabla de datos se ve así:
CREATE TABLE TicketAssigment (
TicketId INT NOT NULL,
AssignedDate DATE NOT NULL,
DepartmentId INT NOT NULL);
Lo que necesito es completar las fechas faltantes para cada TicketId, usando el DepartmentId de la fila TicketAssigment anterior ordenada por Fecha.
Si tengo filas de TicketAssigment como esta:
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
Quiero esta salida:
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
Parece que podría estar cerca de lo que necesito, pero no he tenido la paciencia para dejar que termine, y el costo estimado del plan tiene 6 dígitos:
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;
Sospecho que hay una manera de hacer esto usando LAG y un marco de ventana, pero aún no lo he descubierto. ¿Cuál es una forma más eficiente de cumplir con el requisito?
fuente