查询近2个月内下单完全相同订单的重复客户
解决整单重复订单的筛选问题
你之前的SQL只针对单个商品维度统计,根本没法判断整单的商品组合及对应数量是否完全一致,自然得不到符合预期的结果。要实现需求,核心是先给每个订单生成一个能代表其商品+数量组合的"唯一指纹",再基于客户和这个指纹抓取重复订单。
修正后的实现思路
- 生成订单指纹:把每个订单下的所有商品和对应数量按固定规则(比如按商品名排序后拼接)整合成一个字符串,确保完全相同的订单会得到一模一样的指纹。
- 筛选重复指纹:针对近2个月的订单,按客户+订单指纹分组,找出出现过不止一次的组合。
- 关联回原表:把符合条件的订单和客户信息完整提取出来。
可直接运行的SQL代码
-- 生成每个订单的商品组合指纹,限定近2个月的订单 WITH OrderFingerprints AS ( SELECT o.Order_No, o.Customer_ID, o.Order_Date, -- 按商品排序后拼接,避免因商品顺序不同导致指纹不一致 STRING_AGG(CONCAT(oi.Order_Items, ':', oi.Order_Quantity), '|' ORDER BY oi.Order_Items) AS Order_Fingerprint FROM Order_Table o JOIN Order_Items_Table oi ON o.Order_No = oi.Order_No -- 近2个月的日期条件,根据你的数据库类型调整函数 WHERE o.Order_Date >= DATEADD(MONTH, -2, GETDATE()) -- 可选:如果只统计已完成的有效订单,加上这个条件 AND o.Order_Status = '已完成' GROUP BY o.Order_No, o.Customer_ID, o.Order_Date ), -- 找出客户名下重复出现的订单指纹 DuplicateOrderGroups AS ( SELECT Customer_ID, Order_Fingerprint FROM OrderFingerprints GROUP BY Customer_ID, Order_Fingerprint -- 筛选出现过至少2次不同订单的组合 HAVING COUNT(DISTINCT Order_No) > 1 ) -- 取出所有符合条件的订单及客户信息 SELECT o.*, ofp.Order_Fingerprint FROM Order_Table o JOIN OrderFingerprints ofp ON o.Order_No = ofp.Order_No JOIN DuplicateOrderGroups dog ON ofp.Customer_ID = dog.Customer_ID AND ofp.Order_Fingerprint = dog.Order_Fingerprint ORDER BY o.Customer_ID, o.Order_Date;
不同数据库的适配说明
- 字符串拼接函数:
- SQL Server/PostgreSQL:使用
STRING_AGG - MySQL:替换为
GROUP_CONCAT(CONCAT(oi.Order_Items, ':', oi.Order_Quantity) ORDER BY oi.Order_Items SEPARATOR '|')
- SQL Server/PostgreSQL:使用
- 日期条件:
- MySQL:
o.Order_Date >= DATE_SUB(CURDATE(), INTERVAL 2 MONTH) - Oracle:
o.Order_Date >= ADD_MONTHS(SYSDATE, -2)
- MySQL:
- 大订单优化:如果订单商品数量较多,拼接字符串可能超长,可将拼接结果转成哈希值(比如
MD5(STRING_AGG(...))),用哈希值做指纹更高效。
内容的提问来源于stack exchange,提问作者M_91
相关产品推荐
相关产品推荐

