SQL查询订单表更新记录 生成每日订单变更差异报表需求咨询
SQL查询实现方案
适用场景说明
适配MySQL 8.0+/PostgreSQL/SQL Server等支持CTE的主流数据库,低版本MySQL可将CTE替换为子查询使用。
每日运行版本(仅返回当日发生变更的订单的所有历史记录)
WITH order_change_flag AS ( SELECT OrderNO, COUNT(DISTINCT OrderQty) > 1 AS is_changed FROM 订单表 -- 此处替换为实际表名 WHERE OrderNO IN ( -- 筛选当日有新记录生成的订单 SELECT DISTINCT OrderNO FROM 订单表 WHERE CAST(CreatedOn AS DATE) = CURDATE() -- 不同数据库适配调整: -- SQL Server替换为:CAST(CreatedOn AS DATE) = CAST(GETDATE() AS DATE) -- PostgreSQL替换为:CreatedOn::DATE = CURRENT_DATE ) GROUP BY OrderNO ) SELECT t.* FROM 订单表 t JOIN order_change_flag f ON t.OrderNO = f.OrderNO WHERE f.is_changed = 1 ORDER BY t.OrderNO, t.CreatedOn ASC;
全量版本(返回所有历史上存在过变更的订单的所有记录)
WITH order_change_flag AS ( SELECT OrderNO, COUNT(DISTINCT OrderQty) > 1 AS is_changed FROM 订单表 GROUP BY OrderNO ) SELECT t.* FROM 订单表 t JOIN order_change_flag f ON t.OrderNO = f.OrderNO WHERE f.is_changed = 1 ORDER BY t.OrderNO, t.CreatedOn ASC;
逻辑说明
- 先通过子查询锁定需要校验的订单范围:每日运行版本仅校验当日有新记录的订单,缩小计算范围提升性能
- 按订单号分组统计不同
OrderQty的数量,数量大于1即判定该订单存在数量变更 - 关联原表返回存在变更的订单的全部历史版本,按创建时间排序可直观查看变更轨迹
注:如果表中存在完全重复的冗余记录(如示例中ID为126948的两条完全相同的记录),可在查询前先通过
DISTINCT去重避免误判。
内容的提问来源于stack exchange,提问作者flo_rin
相关产品推荐
相关产品推荐

