如何筛选订单数量按时间递增的客户?SQL查询求助
筛选订单总数量随时间递增的客户
要实现这个需求,核心是验证每个客户的所有订单按时间排序后,后续订单的总购买量不会低于之前的订单。下面是分步实现的SQL方案:
步骤1:计算每个订单的总购买量
首先关联order和orderDetails表,按订单ID分组,统计每个订单的总商品数量:
WITH order_totals AS ( SELECT o.customerID, od.orderID, od.orderDate, SUM(od.quantity) AS total_quantity FROM `order` o JOIN orderDetails od ON o.orderID = od.orderID GROUP BY o.customerID, od.orderID, od.orderDate )
步骤2:给客户的订单按时间排序
为每个客户的订单分配序号,方便后续对比前后订单:
customer_order_sequence AS ( SELECT customerID, orderDate, total_quantity, ROW_NUMBER() OVER (PARTITION BY customerID ORDER BY orderDate, orderID) AS seq_num FROM order_totals )
这里加上orderID是为了处理同一天多个订单的情况,确保排序逻辑稳定。
步骤3:找出存在递减情况的客户
对比每个客户的相邻订单,找出那些出现后序订单总数量低于前序的客户:
customer_has_decrease AS ( SELECT DISTINCT curr.customerID FROM customer_order_sequence curr JOIN customer_order_sequence prev ON curr.customerID = prev.customerID AND curr.seq_num = prev.seq_num + 1 WHERE curr.total_quantity < prev.total_quantity )
步骤4:筛选符合条件的客户
最后从客户表中排除存在递减情况的客户,剩下的就是订单总数量随时间递增的客户:
SELECT c.id, c.name FROM customer c LEFT JOIN customer_has_decrease chd ON c.id = chd.customerID WHERE chd.customerID IS NULL -- 如果只需要筛选有订单记录的客户,加上下面的条件 AND EXISTS ( SELECT 1 FROM `order` o WHERE o.customerID = c.id );
补充说明
- 只有一笔订单的客户会自动被包含,因为不存在前后订单对比的情况。
- 如果你的SQL方言不支持CTE(比如旧版本MySQL),可以将CTE替换为嵌套子查询,核心逻辑保持不变。
order是SQL保留字,所以用反引号包裹;不同数据库可能需要替换为方括号(如SQL Server)或双引号(如PostgreSQL)。
内容的提问来源于stack exchange,提问作者Tomm
相关产品推荐
相关产品推荐

