Oracle SQL技术问询:如何检测特定ID的支付方式变更情况
检测Oracle中支付方式变更的SQL解决方案
要找出那些支付方式相较于上次记录发生变更的ID,我们可以借助Oracle的窗口函数来高效实现这个需求。这里核心用到LAG()函数获取每个ID的上一次支付方式,再结合行号筛选出最新的记录进行对比。
实现思路
- 对每个ID的支付记录按支付日期降序排序,确保最新的记录排在最前面。
- 使用
LAG()函数获取当前记录对应的上一次支付方式。 - 筛选出每个ID的最新记录,并且仅保留其支付方式与上一次不同的条目。
完整SQL语句
WITH latest_payment_with_prev AS ( SELECT ID, PAYMENT_METHOD, "DATE", -- DATE是Oracle保留关键字,需用双引号括起;若字段名为PAYMENT_DATE可直接使用 -- 获取当前ID的上一次支付方式 LAG(PAYMENT_METHOD) OVER (PARTITION BY ID ORDER BY "DATE" DESC) AS PREV_PAYMENT_METHOD, -- 标记每个ID的最新记录(行号为1的是最新条目) ROW_NUMBER() OVER (PARTITION BY ID ORDER BY "DATE" DESC) AS rn FROM YOUR_PAYMENT_TABLE -- 替换为你的实际表名 ) SELECT ID, PAYMENT_METHOD AS "PAYMENT METHOD", 'YES' AS "HAS CHANGED" -- 可选:明确标识已变更,不需要可直接移除该字段 FROM latest_payment_with_prev WHERE rn = 1 -- 仅保留每个ID的最新支付记录 AND PAYMENT_METHOD != PREV_PAYMENT_METHOD -- 支付方式与上一次记录不同 ORDER BY ID;
结果说明
针对你提供的示例数据,执行上述SQL后会得到如下结果(若移除HAS CHANGED字段则与你期望的格式完全一致):
| ID | PAYMENT METHOD | HAS CHANGED |
|---|---|---|
| 1 | CASH | YES |
| 3 | CHEQUE | YES |
注意事项
- 如果表中
DATE字段名确实使用了这个Oracle保留关键字,一定要用双引号括起来避免语法错误,更推荐将字段名修改为PAYMENT_DATE这类非关键字名称。 - 若某个ID只有一条支付记录,
LAG()会返回NULL,这类条目不会被筛选出来——因为没有“上次记录”可对比,符合业务逻辑。
内容的提问来源于stack exchange,提问作者user17966416
相关产品推荐
相关产品推荐

