在财务对账场景中,我们常需要把同一账户的前后两笔记录放在一起,看金额是否连续、是否存在异常跳跃。SQL的窗口函数可以在不破坏行数的情况下为每行附加相邻行的信息,其中LEAD函数专门用于获取当前行之后的某一行数据,非常适合做差异识别。

什么是LEAD窗口函数
LEAD函数的基本语法为 LEAD(列名, 偏移量, 默认值) OVER (PARTITION BY 分组 ORDER BY 排序)。它返回当前行之后第N行的值,如果后面没有行则返回默认值。在财务对账里,我们可以用它把下一笔交易金额拉到当前行,直接和当前金额做差。
准备示例数据
假设有一张流水表 record,结构如下:
| 字段 | 说明 |
|---|---|
| acc_id | 账户编号 |
| trans_date | 交易日期 |
| amount | 交易金额 |
使用LEAD对比相邻记录
下面的查询按账户分区、按日期排序,用LEAD取出下一笔金额,并计算差异:
-- 创建示例表
CREATE TABLE record (
acc_id INT,
trans_date DATE,
amount DECIMAL(10,2)
);
-- 插入测试数据
INSERT INTO record VALUES
(1, '2023-01-01', 100.00),
(1, '2023-01-02', 150.00),
(1, '2023-01-03', 150.00),
(2, '2023-01-01', 200.00),
(2, '2023-01-02', 180.00);
-- 使用LEAD函数对比
SELECT
acc_id,
trans_date,
amount AS cur_amount,
LEAD(amount, 1) OVER (
PARTITION BY acc_id
ORDER BY trans_date
) AS next_amount,
LEAD(amount, 1) OVER (
PARTITION BY acc_id
ORDER BY trans_date
) - amount AS diff
FROM record
ORDER BY acc_id, trans_date;
如何识别差异
从查询结果看,diff 为 0 表示相邻两笔金额一致;diff 不为 0 或 next_amount 为 NULL(已是该账户最后一行)时,可结合业务规则判断是否属于漏记或对账差异。例如账户1在1月2日和1月3日金额相同,diff为0;而1月1日到1月2日 diff为50,可进一步核查是否有未入账调整。
常见对账规则写法
- 只查异常:在外部套一层子查询,WHERE diff IS NOT NULL AND diff <> 0。
- 标记尾行:用 CASE WHEN next_amount IS NULL THEN '末笔' ELSE '正常' END。
- 跨日核对:把 ORDER BY 改为 trans_date 与批次号组合,适应按批对账。
小结
通过 LEAD 这类窗口函数,财务对账从繁琐的表连接变成清晰的一行内比对,逻辑易读且性能稳定。实际工作中只需按账户与日期分区排序,即可快速输出差异清单,辅助会计人员定位问题凭证。