SQL Server 2008编写UPDATE语句获取同分组上一行Year字段值咨询
解决方案
SQL Server 2008 不支持 2012 及以上版本才提供的LAG()窗口函数,我们可以通过 CTE(公用表表达式)+ 行号自连接 的方案实现需求,假设你的源表名为RefYearData,请替换为实际表名:
步骤1:新增PrevYear字段
先给源表新增用于存储上一年份的字段:
ALTER TABLE RefYearData ADD PrevYear INT NULL;
步骤2:更新PrevYear字段值
先通过CTE给每个refNumber分组内的记录按Year升序排序生成行号,再通过自关联匹配上一行的Year值完成更新:
WITH RankedData AS ( SELECT refNumber, Year, -- 按refNumber分组,分组内按Year升序生成连续行号 ROW_NUMBER() OVER (PARTITION BY refNumber ORDER BY Year ASC) AS RowNum FROM RefYearData ) UPDATE t1 SET t1.PrevYear = t2.Year FROM RefYearData t1 INNER JOIN RankedData r1 ON t1.refNumber = r1.refNumber AND t1.Year = r1.Year -- 匹配同分组内、行号比当前行小1的上一行记录 LEFT JOIN RankedData r2 ON r1.refNumber = r2.refNumber AND r1.RowNum = r2.RowNum + 1;
补充说明:如果存在同一个
refNumber下有多个相同Year的记录,可以调整ROW_NUMBER()的排序规则,增加其他唯一字段作为排序条件,避免行号重复。
验证结果
更新完成后执行查询即可得到预期效果:
SELECT refNumber, Year, PrevYear FROM RefYearData ORDER BY refNumber, Year;
内容的提问来源于stack exchange,提问作者Milla
相关产品推荐
相关产品推荐

