Hình ảnh vé bàn trợ giúp được chuyển giữa các bộ phận. Chúng tôi muốn biết bộ phận này là gì vào cuối ngày cho mỗi vé cho mỗi ngày mà vé được mở. Bảng chứa bộ phận cuối cùng cho mỗi vé cho mỗi ngày nó được mở trên đó có sự thay đổi trong bộ phận (bao gồm một hàng cho ngày mà vé ban đầu được mở và ngày được đóng). Bảng dữ liệu trông như thế này:
CREATE TABLE TicketAssigment (
TicketId INT NOT NULL,
AssignedDate DATE NOT NULL,
DepartmentId INT NOT NULL);
Những gì tôi cần là điền vào bất kỳ ngày bị thiếu nào cho mỗi TicketId, bằng cách sử dụng DepartmentId từ hàng TicketAssigment trước đó được sắp xếp theo Ngày.
Nếu tôi có các hàng TicketAssigment như thế này:
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
Tôi muốn đầu ra này:
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
Điều này có vẻ như có thể gần với những gì tôi cần, nhưng tôi không đủ kiên nhẫn để hoàn thành và chi phí kế hoạch ước tính có 6 chữ số:
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;
Tôi nghi ngờ có một cách để làm điều này bằng cách sử dụng LAG và khung cửa sổ, nhưng tôi vẫn chưa tìm ra. Một cách hiệu quả hơn để đáp ứng yêu cầu là gì?