如何在SQL Server中找出状态序列异常的销售订单记录
解决方案:检索不符合状态流转规则的PICKED记录
在SQL Server中,可以使用窗口函数LAG()来获取每个订单状态变更的上一个状态,从而筛选出不符合规则的记录。具体步骤如下:
核心思路
- 按订单号(
sro_num)分组,按状态变更序列(seq)排序,获取每条记录的上一个状态。 - 筛选出当前状态为
PICKED,且上一个状态不是READY或PARTIALSHIP的记录。
实现SQL代码
SELECT sro_num, seq, stat_code, prev_stat_code AS 上一个状态 FROM ( SELECT sro_num, seq, stat_code, -- 获取同订单的上一个状态 LAG(stat_code) OVER (PARTITION BY sro_num ORDER BY seq) AS prev_stat_code FROM 你的表名 -- 替换为实际表名 ) AS status_history WHERE stat_code = 'PICKED' AND prev_stat_code NOT IN ('READY', 'PARTIALSHIP');
代码说明
LAG(stat_code) OVER (PARTITION BY sro_num ORDER BY seq):按订单号分组,按seq升序排列,取当前行的前一行的stat_code值,也就是该状态变更的前置状态。- 外层查询筛选出当前状态是
PICKED,且前置状态不在允许列表中的记录,这些就是违规的状态变更。
针对你提供的示例数据
运行上述SQL后,会返回以下结果:
sro_num seq stat_code 上一个状态 ------------------------------------ SO00053441 3 PICKED INV HOLD
这条记录的前置状态是INV HOLD,不符合PICKED的前置规则,因此被筛选出来;而SO00053441的第12条PICKED记录,前置状态是READY,符合规则,不会被返回。
内容的提问来源于stack exchange,提问作者Greg
相关产品推荐
相关产品推荐

