Picture Helpdesk-Tickets, die zwischen Abteilungen übertragen werden. Wir möchten wissen, was die Abteilung am Ende des Tages für jedes Ticket für jeden Tag, an dem das Ticket geöffnet ist, ist. Die Tabelle enthält die letzte Abteilung für jedes Ticket für jeden Tag, an dem es geöffnet ist, an dem es eine Änderung in der Abteilung gibt (einschließlich einer Zeile für das Datum, an dem das Ticket ursprünglich geöffnet und geschlossen wurde). Die Datentabelle sieht folgendermaßen aus:
CREATE TABLE TicketAssigment (
TicketId INT NOT NULL,
AssignedDate DATE NOT NULL,
DepartmentId INT NOT NULL);
Ich muss fehlende Daten für jede Ticket-ID unter Verwendung der Abteilungs-ID aus der vorherigen TicketAssigment-Zeile, sortiert nach Datum, ausfüllen.
Wenn ich TicketAssigment-Zeilen wie diese habe:
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
Ich möchte diese Ausgabe:
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
Das sieht so aus, als ob es in der Nähe dessen liegt, was ich brauche, aber ich hatte nicht die Geduld, es zu beenden, und die geschätzten Kosten des Plans bestehen aus 6 Ziffern:
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;
Ich vermute, dass es eine Möglichkeit gibt, dies mit LAG und einem Fensterrahmen zu tun, aber ich habe es nicht ganz herausgefunden. Was ist eine effizientere Möglichkeit, die Anforderung zu erfüllen?