Zdjęcie pomocy technicznej, która jest przenoszona między oddziałami. Chcemy wiedzieć, jaki jest departament na koniec dnia dla każdego biletu na każdy dzień, w którym bilet jest otwarty. Tabela zawiera ostatni dział dla każdego biletu dla każdego dnia, w którym jest otwarty, w którym następuje zmiana w dziale (w tym wiersz dotyczący daty pierwszego otwarcia biletu i daty jego zamknięcia). Tabela danych wygląda następująco:
CREATE TABLE TicketAssigment (
TicketId INT NOT NULL,
AssignedDate DATE NOT NULL,
DepartmentId INT NOT NULL);
Potrzebuję uzupełnić brakujące daty dla każdego TicketId, używając DepartmentId z poprzedniego wiersza TicketAssigment uporządkowanego według daty.
Jeśli mam takie wiersze 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
Chcę tego wyniku:
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
Wygląda na to, że może być blisko tego, czego potrzebuję, ale nie miałem cierpliwości, aby to zakończyć, a szacowany koszt planu ma 6 cyfr:
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;
Podejrzewam, że można to zrobić za pomocą LGD i ramy okiennej, ale nie do końca to rozgryzłem. Jaki jest bardziej skuteczny sposób spełnienia tego wymagania?
źródło