如何按user_id统计各产品的买家类型数量?MySQL 8.0实现
按产品统计不同购买频次的用户数解决方案
要实现按产品统计买一次、买两次的用户数量,我们可以通过分组统计+条件聚合的方式完成,具体步骤如下:
1. 先计算每个用户对单个产品的购买次数
首先需要得到每个用户针对每个产品的购买次数,这一步通过分组查询实现:
SELECT user_id, Product, COUNT(*) AS purchase_count FROM your_table_name -- 替换成你的实际表名 GROUP BY user_id, Product;
这个子查询会输出类似(user_id=1, chair, 2)、(user_id=2, chair, 1)这样的结果,清晰展示每个用户对各产品的购买频次。
2. 基于频次统计各产品的用户类型数量
利用条件聚合,对上面的结果按产品分组,分别统计购买次数为1和2的用户数:
SELECT Product, -- 统计购买1次的用户数 SUM(CASE WHEN purchase_count = 1 THEN 1 ELSE 0 END) AS BoughtOnce, -- 统计购买2次的用户数,无数据则显示NULL SUM(CASE WHEN purchase_count = 2 THEN 1 ELSE NULL END) AS BoughtTwice FROM ( SELECT user_id, Product, COUNT(*) AS purchase_count FROM your_table_name GROUP BY user_id, Product ) AS user_product_purchases GROUP BY Product ORDER BY Product;
关于你尝试的窗口函数问题
你之前使用的窗口函数COUNT(DISTINCT Product) OVER (PARTITION BY user_id)是计算每个用户购买的不同产品总数,并非针对单个产品的购买次数,方向上不符合需求。另外,MySQL不支持在聚合函数中直接嵌套窗口函数,必须先将窗口函数的结果通过子查询/CTE固化后再使用——但在这个场景下,直接分组统计比窗口函数更高效简洁。
可选调整
- 如果希望
BoughtTwice在无数据时显示0而非NULL,将ELSE NULL改为ELSE 0即可。 - 若需要支持更多频次(如购买3次及以上),只需添加对应的
SUM(CASE WHEN purchase_count = 3 THEN 1 ELSE 0 END) AS BoughtThreeTimes这类语句。
内容的提问来源于stack exchange,提问作者beth_9
相关产品推荐
相关产品推荐

