/ / SQL Server 2012-LAGを使用して前の行からデータを取得する-sql-server-2012、lag

SQL Server 2012 - LAGを使用して前の行からデータを取得する - sql-server-2012、遅れ

LAGを使用して前の行からデータを取得できましたが、それを使用してより複雑な問題を解決するのに苦労しています。

基本的に、私のテーブルの各エピソードには、たとえば、10のユニークな出席があります。各出席の値は1、2、または3です。

私が達成する必要があるのは、出席値が増加する場合、次のすべての行が同じ値を持つ必要があることです。

例えば

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

したがって、新しい値は1から2または3に、2から3に増加する可能性がありますが、決して減少してはなりません。

これに関するヘルプは大歓迎です。 LAGを使用するのは正しい答えではないかもしれませんが、私はあなたが集まっているかもしれないので、初心者です。

これが今までに得た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

1行だけで機能し、その理由はわかりますが、改善するための十分なガイダンスが見つかりませんでした。

イライラして、私はExcelでこれを行うことができますが、私は私のSQLスキルを向上させようとしています

回答:

回答№1は1

このソリューションでは、CTEを使用して問題を解決します。 CTEは、各エピソードグループおよび出席イベントについて、カウンターがどの行を増やすべきかをチェックします。次に、テーブルに結合し、エピソードに基づいて出席イベントに必要な最大値を割り当てます。

    ;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