SQL Server 2012 - 使用 LAG 从以前的行中获取数据

Posted

技术标签:

【中文标题】SQL Server 2012 - 使用 LAG 从以前的行中获取数据【英文标题】:SQL Server 2012 - Using LAG to get data off previous rows 【发布时间】:2016-02-17 18:16:09 【问题描述】:

我已经能够使用 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

它只适用于一行,我知道为什么,但我没有找到足够的指导来改进它。

令人沮丧的是,我可以在 Excel 中执行此操作,但我正在努力提高我的 SQL 技能

【问题讨论】:

刚刚意识到它没有在我的表格示例中留下表格格式 - 我如何让它正确显示? 我们系统中的出勤率被编码为 1、2 或 3 级,我被要求计算有多少 2 级和 3 级出勤率。简单的。但是,在一个情节中,如果出勤率较高,则所有后续出勤率都应计入该新级别。之前的保持不变。因此,按 1,1,1,2,1,1,3 顺序排列的出勤值将变为 1,1,1,2,2,2,3。 你应该向我们展示你迄今为止所尝试的。否则,您的问题看起来就像“为我做作业”,人们不太可能回答。 感谢 Toby - 用我的代码编辑 【参考方案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

【讨论】:

这就是答案 - 非常感谢 dfundako!正是我需要的。

以上是关于SQL Server 2012 - 使用 LAG 从以前的行中获取数据的主要内容,如果未能解决你的问题,请参考以下文章

在sqlserver 2008 怎么配置才可以正常支持lead和lag分析函数

SQL SERVER LEAD和LAG使用

SQL Server 2012 - 使用积压和结转运行总计

在 SQL Server 中使用上一行和下一行值 (LAG & LEAD) 计算总结束数量

SQL Server Lag 函数添加范围

如何使LAG()在SQL Server中忽略NULL?