Access中筛选指定Type值的行及其前后行的技术问询
Access数据表筛选:包含Type='D'行及其上下行的实现
问题分析
你需要筛选出三类行:Type='D'的行、Type='D'行的上一行、Type='D'行的下一行。原SQL的问题在于WHERE条件仅筛选了当前行Type为目标值的情况,未覆盖上下行的匹配逻辑。
解决方案1:使用窗口函数(Access 2019及以后版本支持)
利用LAG()和LEAD()窗口函数获取每行的上一行、下一行Type值,然后通过WHERE条件匹配三类目标行:
SELECT id, type, prev_type, next_type FROM ( SELECT id, type, LAG(type) OVER (ORDER BY id) AS prev_type, LEAD(type) OVER (ORDER BY id) AS next_type FROM [table] -- Access中表名若为关键字需用方括号包裹 ) AS t WHERE type = "D" OR prev_type = "D" OR next_type = "D";
- 说明:子查询通过
LAG()获取当前行的上一行Type,LEAD()获取下一行Type;外层查询筛选出当前行是D、上一行是D(当前行是D的下一行)、下一行是D(当前行是D的上一行)的记录。
解决方案2:兼容旧版Access(不支持窗口函数时)
如果你的Access版本不支持窗口函数,可以通过自连接+子查询实现:
SELECT DISTINCT t1.id, t1.type FROM [table] t1 INNER JOIN [table] t2 ON t1.id = t2.id OR t1.id = (SELECT MAX(id) FROM [table] WHERE id < t2.id) OR t1.id = (SELECT MIN(id) FROM [table] WHERE id > t2.id) WHERE t2.type = "D";
- 说明:通过自连接匹配所有与Type='D'行ID相同、ID为其前一个最大ID、ID为其后一个最小ID的记录,用
DISTINCT避免重复结果。
额外注意事项
- 确保
id是可排序的唯一标识,否则排序和匹配逻辑会出错; - Access中表名/字段名若为SQL关键字,必须用方括号
[]包裹; - 字符串常量可使用双引号
""或单引号'',建议统一格式。
内容的提问来源于stack exchange,提问作者skylark
相关产品推荐
相关产品推荐

