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
相关产品推荐
相关产品推荐

