You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 06:10:58