Gambar tiket help desk yang ditransfer antar departemen. Kami ingin tahu apa departemen pada akhir hari untuk setiap tiket untuk setiap hari tiket dibuka. Tabel berisi departemen terakhir untuk setiap tiket untuk setiap hari tiket terbuka di mana ada perubahan di departemen (termasuk baris untuk tanggal tiket awalnya dibuka dan tanggal penutupan). Tabel data terlihat seperti ini:
CREATE TABLE TicketAssigment (
TicketId INT NOT NULL,
AssignedDate DATE NOT NULL,
DepartmentId INT NOT NULL);
Yang saya butuhkan adalah mengisi tanggal yang hilang untuk setiap TicketId, menggunakan DepartmentId dari baris TicketAssigment sebelumnya yang dipesan berdasarkan Tanggal.
Jika saya memiliki baris TicketAssigment seperti ini:
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
Saya ingin hasil ini:
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
Ini sepertinya dekat dengan yang saya butuhkan, tetapi saya belum memiliki kesabaran untuk menyelesaikannya, dan perkiraan biaya rencana memiliki 6 digit:
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;
Saya curiga ada cara untuk melakukan ini menggunakan LAG dan bingkai jendela, tapi saya belum mengetahuinya. Apa cara yang lebih efisien untuk memenuhi persyaratan?