MS Access SQL(mdb)无编辑权限场景下同列数值差值计算方案求解
问题说明
我有一张表包含两列非唯一值,数值均为自动生成,我没有任何操作权限,既不能编辑表、数据库,也无法创建自定义函数。我已在SQL Server中解决该问题,但用到的部分函数在MS Access中不存在。
涉及字段为Volume和ComponentID,SQL Server版本的实现代码如下:
with rows as ( select row_number() over (order by volume) as rownum, volume from test where componentid = 'S3') select top 10 rowsMinusOne.volume, coalesce(rowsMinusOne.volume - rows.volume,0) as diff from rows as rowsMinusOne left outer join rows on rows.rownum = rowsMinusOne.rownum - 1
示例数据
58.29168 70.57396 85.67902 97.04888 107.7026 108.2022 108.3975 108.5777 109 109.8944
预期结果
| Volume | diff |
|---|---|
| 58.29168 | 0 |
| 70.57396 | 12.28228 |
| 85.67902 | 15.10506 |
| 97.04888 | 11.36986 |
| 107.7026 | 10.65368 |
| 108.2022 | 0.4996719 |
| 108.3975 | 0.1952896 |
| 108.5777 | 0.1801834 |
| 109 | 0.4223404 |
| 109.8944 | 0.89431 |
已尝试操作
- 用NZ函数替换了coalesce
- 尝试用DCOUNT实现row_number功能,报错找不到该函数,仅能通过代码读取数据
- 尝试等效ROW_NUMBER的其他方案,但方案要求表存在唯一值列,既没有该字段也无法创建
可用解决方案
不需要自定义函数、不需要新增字段、不需要唯一列,完全兼容MS Access语法的查询代码如下:
SELECT TOP 10 a.Volume, NZ(a.Volume - MAX(b.Volume), 0) AS diff FROM test AS a LEFT JOIN test AS b ON a.ComponentID = b.ComponentID AND b.ComponentID = 'S3' AND b.Volume < a.Volume WHERE a.ComponentID = 'S3' GROUP BY a.Volume ORDER BY a.Volume
实现逻辑
- 左右表均先过滤
ComponentID='S3'的目标数据 - 左表每条记录关联右表中所有Volume小于当前值的记录,取右表最大的Volume,即为当前记录的上一条Volume值
- 用NZ函数处理首条记录无匹配上一条的场景,返回0
- 按Volume升序排序后取前10条,即可得到和预期完全一致的结果
内容的提问来源于stack exchange,提问作者Ezequiel
相关产品推荐
相关产品推荐

