Bölümler arasında aktarılan resim yardım masası biletleri. Biletin açık olduğu her gün için her bir bilet için günün sonunda bölümün ne olduğunu bilmek istiyoruz. Tabloda, açık olduğu her gün için her bir biletin son bölümü, bölümde bir değişiklik olduğu (biletin ilk açıldığı tarih ve kapatıldığı tarih için bir satır dahil) bulunur. Veri tablosu şöyle görünür:
CREATE TABLE TicketAssigment (
TicketId INT NOT NULL,
AssignedDate DATE NOT NULL,
DepartmentId INT NOT NULL);
Ne ihtiyacım var her TicketId eksik tarih doldurmak için tarihe göre sipariş önceki TicketAssigment satır DepartmentId kullanarak.
Eğer böyle TicketAssigment satır varsa:
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
Bu çıktıyı istiyorum:
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
Bu, ihtiyacım olan şeye yakın olabilir, ancak bitmesine izin vermek için sabrım olmadı ve tahmini plan maliyetinin 6 hanesi var:
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;
LAG ve bir pencere çerçevesi kullanarak bunu yapmanın bir yolu olduğundan şüpheleniyorum, ama tam olarak anlayamadım. İhtiyacı karşılamanın daha etkili bir yolu nedir?