/ / SQL Server 2012 - Usando o LAG para obter dados das linhas anteriores - sql-server-2012, lag

SQL Server 2012 - Usando o LAG para obter dados das linhas anteriores - sql-server-2012, lag

Consegui usar o LAG para obter dados de uma linha anterior, mas estou tendo dificuldades para usá-lo para resolver um problema mais complicado.

Essencialmente, para cada episódio da minha mesa, pode haver, por exemplo, 10 participações únicas. Cada participação tem um valor de 1, 2 ou 3.

O que preciso realizar é quando um valor de participação aumenta, todas as linhas a seguir devem ter o mesmo valor.

por exemplo.

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

Portanto, o novo valor pode aumentar de 1 para 2 ou 3 e de 2 para 3, mas nunca deve diminuir.

Qualquer ajuda com isso seria muito apreciado. Usar o LAG pode não ser a resposta certa, mas sou um pouco novato, como você deve ter percebido.

Aqui está o SQL que eu tenho até agora:

    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

Ele funciona apenas para uma linha e eu posso ver o porquê, mas não encontrei orientação suficiente para aprimorá-la.

Frustrantemente, eu poderia fazer isso no Excel, mas estou tentando melhorar minhas habilidades em SQL

Respostas:

1 para resposta № 1

Esta solução usa um CTE para resolver o problema. O CTE verifica em qual linha o contador deve aumentar para cada grupo de episódios e evento de presença. Em seguida, ele se junta à sua mesa e atribui o valor máximo que o evento de participação deve ter com base no seu episódio.

    ;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