Image des tickets d'assistance qui sont transférés entre les départements. Nous voulons savoir quel est le département en fin de journée pour chaque ticket pour chaque jour d'ouverture du ticket. Le tableau contient le dernier département de chaque ticket pour chaque jour d'ouverture pour lequel il y a un changement dans le département (y compris une ligne pour la date d'ouverture initiale du ticket et la date de fermeture). Le tableau de données ressemble à ceci:
CREATE TABLE TicketAssigment (
TicketId INT NOT NULL,
AssignedDate DATE NOT NULL,
DepartmentId INT NOT NULL);
Ce dont j'ai besoin, c'est de remplir toutes les dates manquantes pour chaque TicketId, en utilisant le DepartmentId de la ligne TicketAssigment précédente commandée par Date.
Si j'ai des lignes TicketAssigment comme ceci:
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
Je veux cette sortie:
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
On dirait que cela pourrait être proche de ce dont j'ai besoin, mais je n'ai pas eu la patience de le laisser finir, et le coût du plan estimé a 6 chiffres:
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;
Je soupçonne qu'il existe un moyen de le faire en utilisant LAG et un cadre de fenêtre, mais je ne l'ai pas tout à fait compris. Quelle est la manière la plus efficace de répondre à l'exigence?
la source