Byłem w stanie użyć LGD, aby uzyskać dane z poprzedniego wiersza, ale staram się je wykorzystać do rozwiązania bardziej skomplikowanego problemu.
Zasadniczo dla każdego odcinka w moim stole może być, powiedzmy, 10 niepowtarzalnych frekwencji. Każda frekwencja ma wartość 1, 2 lub 3.
Muszę osiągnąć, gdy wartość frekwencji wzrośnie, wszystkie kolejne wiersze muszą mieć tę samą wartość.
na przykład
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
Tak więc nowa wartość może wzrosnąć z 1 do 2 lub 3 i od 2 do 3, ale nigdy nie powinna się zmniejszać.
Każda pomoc zostanie doceniona. Korzystanie z LGD może nie być właściwą odpowiedzią, ale jestem trochę nowicjuszem, jak mogłeś się dowiedzieć.
Oto dotychczasowy kod SQL:
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
Działa tylko w jednym rzędzie i nie rozumiem, dlaczego, ale nie znalazłem wystarczających wskazówek, aby go poprawić.
Frustrujące jest to, że mogę to zrobić w programie Excel, ale próbuję poprawić swoje umiejętności SQL
Odpowiedzi:
1 dla odpowiedzi № 1To rozwiązanie wykorzystuje CTE do rozwiązania problemu. CTE sprawdza, jaki wiersz licznik powinien zwiększyć dla każdej grupy odcinków i zdarzenia obecności. Następnie dołącza do stołu i przypisuje maksymalną wartość, jaką powinno mieć zdarzenie związane z uczestnictwem na podstawie Twojego odcinka.
;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