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

SQLite中如何对比客户不同日期的订单数量?

对比同一客户不同日期的订单数量解决方案

没问题,我来帮你搞定这个需求!首先先把你那半写完的每日订单统计语句补全,确保能正确生成每个客户每天的订单总量数据:

SELECT 
    A.customer_id, 
    B.name, 
    SUM(A.quantity) AS daily_total, 
    strftime('%Y-%m-%d', A.order_date) AS order_date
FROM orders A
LEFT JOIN customers B ON A.customer_id = B.customer_id
GROUP BY A.customer_id, B.name, strftime('%Y-%m-%d', A.order_date)
ORDER BY A.customer_id, order_date;

基于这个基础数据,我分两种常见场景给你提供对比方案:

1. 对比同一客户相邻日期的订单量(比如和前一天的差异)

SQLite支持LAG()窗口函数,它能帮我们获取同一客户分组内上一个日期的订单数据,直接算出和前一天的订单量差值:

WITH daily_customer_orders AS (
    SELECT 
        A.customer_id, 
        B.name, 
        SUM(A.quantity) AS daily_total, 
        strftime('%Y-%m-%d', A.order_date) AS order_date
    FROM orders A
    LEFT JOIN customers B ON A.customer_id = B.customer_id
    GROUP BY A.customer_id, B.name, strftime('%Y-%m-%d', A.order_date)
)
SELECT 
    customer_id,
    name,
    order_date,
    daily_total,
    LAG(daily_total) OVER (PARTITION BY customer_id ORDER BY order_date) AS previous_day_total,
    daily_total - LAG(daily_total) OVER (PARTITION BY customer_id ORDER BY order_date) AS quantity_diff_from_prev_day
FROM daily_customer_orders
ORDER BY customer_id, order_date;

说明:PARTITION BY customer_id确保只在当前客户的范围内查找前一天数据,ORDER BY order_date保证日期按时间顺序排列,这样LAG()就能准确拿到上一个日期的订单总量,最后一列直接算出和前一天的数量差。

2. 对比同一客户任意两个指定日期的订单量

如果你需要对比特定两个日期(比如2023-10-01和2023-10-05)的订单量,可以用自连接的方式实现:

WITH daily_customer_orders AS (
    SELECT 
        A.customer_id, 
        B.name, 
        SUM(A.quantity) AS daily_total, 
        strftime('%Y-%m-%d', A.order_date) AS order_date
    FROM orders A
    LEFT JOIN customers B ON A.customer_id = B.customer_id
    GROUP BY A.customer_id, B.name, strftime('%Y-%m-%d', A.order_date)
)
SELECT 
    d1.customer_id,
    d1.name,
    d1.order_date AS date1,
    d1.daily_total AS total1,
    d2.order_date AS date2,
    d2.daily_total AS total2,
    d1.daily_total - d2.daily_total AS quantity_diff
FROM daily_customer_orders d1
JOIN daily_customer_orders d2 ON d1.customer_id = d2.customer_id
WHERE d1.order_date = '2023-10-01' AND d2.order_date = '2023-10-05' -- 替换成你要对比的日期
ORDER BY d1.customer_id;

如果有些客户在其中某一天没有订单,你可以用LEFT JOIN配合COALESCE()把NULL值转为0,避免计算错误:

WITH daily_customer_orders AS (
    SELECT 
        A.customer_id, 
        B.name, 
        SUM(A.quantity) AS daily_total, 
        strftime('%Y-%m-%d', A.order_date) AS order_date
    FROM orders A
    LEFT JOIN customers B ON A.customer_id = B.customer_id
    GROUP BY A.customer_id, B.name, strftime('%Y-%m-%d', A.order_date)
)
SELECT 
    d1.customer_id,
    d1.name,
    d1.order_date AS date1,
    COALESCE(d1.daily_total, 0) AS total1,
    '2023-10-05' AS date2, -- 替换成目标对比日期
    COALESCE(d2.daily_total, 0) AS total2,
    COALESCE(d1.daily_total, 0) - COALESCE(d2.daily_total, 0) AS quantity_diff
FROM daily_customer_orders d1
LEFT JOIN daily_customer_orders d2 
    ON d1.customer_id = d2.customer_id 
    AND d2.order_date = '2023-10-05' -- 替换成目标对比日期
WHERE d1.order_date = '2023-10-01' -- 替换成基准日期
ORDER BY d1.customer_id;

内容的提问来源于stack exchange,提问作者Bobloblawlawblogs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:58:51