/ / SQL Server 2012 - Użycie LAG do usunięcia danych z poprzednich wierszy - sql-server-2012, lag

SQL Server 2012 - Używanie LGD do pobierania danych z poprzednich wierszy - sql-server-2012, lag

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

To 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