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