You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何筛选订单数量按时间递增的客户?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 16:20:45