SQL Server 2012 - 使用 LAG 从前几行中获取数据
SQL Server 2012 - Using LAG to get data off previous rows
我已经能够使用 LAG 从前一行获取数据,但我很难用它来解决更复杂的问题。
基本上,对于我的 table 中的每一集,可能会有 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
它只适用于一行,我知道为什么,但我还没有找到足够的指导来改进它。
令人沮丧的是,我可以在 Excel 中做到这一点,但我正在努力提高我的 SQL 技能
本方案使用CTE来解决问题。 CTE 检查计数器应该为每个剧集组和出席事件增加哪一行。然后它会加入您的 table 并根据您的剧集分配出勤事件应具有的最大值。
;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
我已经能够使用 LAG 从前一行获取数据,但我很难用它来解决更复杂的问题。
基本上,对于我的 table 中的每一集,可能会有 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
它只适用于一行,我知道为什么,但我还没有找到足够的指导来改进它。
令人沮丧的是,我可以在 Excel 中做到这一点,但我正在努力提高我的 SQL 技能
本方案使用CTE来解决问题。 CTE 检查计数器应该为每个剧集组和出席事件增加哪一行。然后它会加入您的 table 并根据您的剧集分配出勤事件应具有的最大值。
;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