SQL Server 2012 - 使用LAG从前一行

时间:2016-02-17 18:16:09

标签: sql-server-2012 lag

我已经能够使用LAG从前一行获取数据,但我很难用它来解决更复杂的问题。

基本上对于我表中的每一集,可能会有10个独特的出席情况。每次出席的人数均为1,2或3。

我需要完成的是当出勤值增加时,以下所有行必须具有相同的值。

e.g。

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技能

1 个答案:

答案 0 :(得分: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