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 № 1Esta 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