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

如何按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 22:13:12