如何将Lag函数转换为MS Access SQL实现值按日期下移一行
解决MS Access SQL无LAG函数实现值偏移的问题
问题分析
你需要为表A(包含Type、Decider、Dates、Values列)新增一列,将Values按Dates顺序向下偏移一行,首行值为NULL。你的原有代码存在以下问题:
- 子查询表别名使用混乱(定义了
m却引用test) - 未按
Type分组处理,会导致跨类型的错误偏移 - 子查询的筛选、分组和排序逻辑不符合需求,无法正确匹配上一行的Values
正确实现代码
方法1:自连接+TOP 1(适合小数据集)
SELECT t1.Type, t1.Decider, t1.Dates, t1.Values, ( SELECT TOP 1 t2.Values FROM 表A AS t2 WHERE t2.Type = t1.Type AND t2.Dates < t1.Dates ORDER BY t2.Dates DESC ) AS Previous_Value FROM 表A AS t1 ORDER BY t1.Type, t1.Dates;
方法2:计数排序关联(适合大数据集,性能更优)
如果Dates存在重复值,或需要更稳定的排序逻辑,可先为每组生成序号再关联:
-- 生成带序号的临时表 SELECT Type, Decider, Dates, Values, (SELECT COUNT(*) FROM 表A AS t2 WHERE t2.Type = t1.Type AND t2.Dates <= t1.Dates) AS RowNum INTO #TempTable FROM 表A AS t1; -- 通过序号关联获取上一行值 SELECT t1.Type, t1.Decider, t1.Dates, t1.Values, t2.Values AS Previous_Value FROM #TempTable AS t1 LEFT JOIN #TempTable AS t2 ON t1.Type = t2.Type AND t1.RowNum = t2.RowNum + 1 ORDER BY t1.Type, t1.Dates; -- 清理临时表 DROP TABLE #TempTable;
代码说明
- 方法1通过自连接,在子查询中精准匹配同Type下日期小于当前行的最新记录,实现值偏移,首行自然返回NULL
- 方法2先为每组(Type)内的行按Dates生成连续序号,再通过序号关联获取上一行值,避免子查询重复扫描,性能更稳定
内容的提问来源于stack exchange,提问作者Kingsley Obeng
相关产品推荐
相关产品推荐

