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

SQLite子查询计算问题:十月下单客户中九月也下单的占比求解

解决SQLite中十月下单客户的九月复购占比计算问题

嘿,我来帮你排查这个问题!你说查询结果返回1,但预期是0.2,这大概率是查询逻辑里踩中了常见坑——要么是关联方式错了,要么是没对客户ID去重,咱们一步步来捋:

首先,给你两个能得到正确结果的查询写法,任选其一即可:

方式一:左连接+去重计数

-- 记得把202X替换成你的实际年份
SELECT 
    COUNT(DISTINCT sep_o.customer_id) * 1.0 / COUNT(DISTINCT oct_o.customer_id) AS repeat_purchase_rate
FROM 
    orders oct_o
LEFT JOIN 
    orders sep_o 
    ON oct_o.customer_id = sep_o.customer_id
    AND strftime('%Y-%m', sep_o.order_date) = '202X-09'
WHERE 
    strftime('%Y-%m', oct_o.order_date) = '202X-10';

方式二:子查询分步统计

SELECT 
    -- 分子:同时在九月、十月下单的去重客户数
    (SELECT COUNT(DISTINCT customer_id) 
     FROM orders 
     WHERE strftime('%Y-%m', order_date) = '202X-09'
     AND customer_id IN (
         SELECT DISTINCT customer_id 
         FROM orders 
         WHERE strftime('%Y-%m', order_date) = '202X-10'
     )) * 1.0 /
    -- 分母:十月下单的去重客户数
    (SELECT COUNT(DISTINCT customer_id) 
     FROM orders 
     WHERE strftime('%Y-%m', order_date) = '202X-10') 
AS repeat_purchase_rate;

接下来分析你可能踩的坑:

  • 误用内连接(INNER JOIN):如果你的查询里用了INNER JOIN而不是LEFT JOIN,结果集只会保留那些同时有九月和十月订单的客户,这时候分母就变成了同时下单的客户数(和分子数值一致),自然结果就是1。这应该是你最可能遇到的问题!
  • 没有对客户ID去重:如果你的count()里没加DISTINCT,比如写了count(t1.customer_id)而不是count(DISTINCT t1.customer_id),会把同一个客户的多次订单重复计数。比如某个客户十月下了5单、九月下了3单,关联后会生成15条记录,计数时会把这个客户算多次,导致分子分母被虚高,甚至可能因为每个十月订单都匹配到九月订单,最终分子等于分母,结果为1。
  • 日期筛选错误:比如用了错误的日期函数提取月份(比如没处理年份,导致把往年九月的订单也算进来),或者筛选条件写错了,导致十月的订单范围不对,这也可能让分子分母的统计结果异常。

另外要注意:SQLite里整数除法会截断小数,所以一定要乘以1.0把整数转成浮点数,不然2/10会得到0而不是0.2(不过你的问题里返回1,这个应该不是当前的问题,但也是个常见小坑)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:36:54