/ / SQL Server 2012 - Utilisation du LAG pour extraire des données des lignes précédentes - sql-server-2012, lag

SQL Server 2012 - Utilisation du LAG pour extraire des données des lignes précédentes - sql-server-2012, décalage

J’ai pu utiliser LAG pour obtenir des données d’une rangée précédente, mais j’ai du mal à les utiliser pour résoudre un problème plus complexe.

Essentiellement, pour chaque épisode de mon tableau, il pourrait y avoir 10 assistances uniques. Chaque présence a une valeur de 1, 2 ou 3.

Ce que je dois accomplir, c’est quand une valeur de présence augmente toutes les lignes suivantes doivent avoir la même valeur.

par exemple.

Episode Attendance Value  New Value
12345      1        1        1
12345      2        1        1
12345      3        2        2
12345      4        1        2
12345      5        1        2
12345      6        2        2
12345      7        3        3
12345      8        1        3
12345      9        1        3
12345      10       1        3
34567      1        1        1
34567      2        2        2
34567      3        1        2
34567      4        2        2
34567      5        1        2
34567      6        3        3
34567      7        1        3
56789      1        2        2
56789      2        1        2
56789      3        1        2

Ainsi, la nouvelle valeur peut augmenter de 1 à 2 ou 3 et de 2 à 3, mais elle ne devrait jamais diminuer.

Toute l'aide pouvant etre apportée serait très appréciée. Utiliser LAG n’est peut-être pas la bonne réponse, mais je suis un peu novice, comme vous l’auriez peut-être compris.

Voici le SQL que j’ai eu jusqu’à présent:

    SELECT *,


NewValue =
CASE    WHEN EPISODEID = Lag(EpisodeID,1) OVER(ORDER BY EpisodeID Asc) AND
LAG(Value, 1) OVER(ORDER BY [EpisodeID] asc, Attendance) >= Value THEN LAG(Value,1)
OVER(ORDER BY [EpisodeID] asc, Attendance)

ELSE        Value
END
FROM TABLE

Cela ne fonctionne que pour une rangée et je peux voir pourquoi, mais je n’ai pas trouvé assez de conseils pour l’améliorer.

Frustrement, je pouvais le faire dans Excel mais j'essaie d'améliorer mes compétences en SQL

Réponses:

1 pour la réponse № 1

Cette solution utilise un CTE pour résoudre le problème. Le CTE vérifie quelle rangée le compteur devrait augmenter pour chaque groupe d'épisodes et événement de présence. Il rejoint ensuite votre table et attribue la valeur maximale que l'événement de présence devrait avoir en fonction de votre épisode.

    ;WITH CTE
AS (
SELECT episode
, value
, MIN(attendance) AS row_counter

FROM [your_table]

GROUP BY episode
, value
)

SELECT t.episode
, t.attendance
, t.value
, MAX(cte.value) AS new_Val

FROM [your_table] t

LEFT JOIN CTE
ON cte.episode = t.episode
AND t.attendance >= cte.row_counter

WHERE cte.episode = t.episode

GROUP BY t.episode
, t.attendance
, t.value

ORDER BY t.episode
, t.attendance