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

如何用SQL统计圣诞竞赛会员参与次数的分布情况?

解决圣诞竞赛参与频次统计问题

你已经找对了方向——先算出每个会员的参与次数,现在只需要多做一步聚合统计,就能得到你想要的「参与次数 | 对应会员数量」格式结果了。

基础解决方案(仅统计有会员的次数)

如果只需要展示实际有会员达到的参与次数对应的会员数,用嵌套查询就能实现:

SELECT participations AS `参与次数`, COUNT(*) AS `对应会员数量`
FROM (
    -- 内层查询:算出每个会员的总参与次数(每条记录对应一次参与)
    SELECT COUNT(*) AS participations
    FROM your_table_name  -- 替换成你的实际表名
    GROUP BY memberid
) AS member_participations
-- 外层查询:按参与次数分组,统计每个次数对应的会员总数
GROUP BY participations
ORDER BY participations ASC;

这个逻辑很直观:

  1. 内层子查询先对memberid分组,把每个会员的记录数(也就是参与次数)算出来;
  2. 外层查询再把这些次数作为分组依据,统计每个次数下有多少会员,最后按次数升序排列。

进阶解决方案:强制显示1-24所有次数(含0会员的情况)

因为竞赛持续24天,可能存在某些次数(比如17次)没有会员达到的情况。如果你希望完整列出1到24次的所有行(没有会员的次数显示0),可以用递归CTE生成1-24的数字序列,再和统计结果做左连接:

WITH numbers AS (
    -- 生成1到24的连续数字序列
    SELECT 1 AS n
    UNION ALL
    SELECT n + 1 FROM numbers WHERE n < 24
)
SELECT 
    numbers.n AS `参与次数`,
    -- 用COALESCE把空值转换成0,处理没有会员的次数
    COALESCE(member_counts.对应会员数量, 0) AS `对应会员数量`
FROM numbers
LEFT JOIN (
    -- 这里复用基础方案的统计逻辑
    SELECT participations, COUNT(*) AS `对应会员数量`
    FROM (
        SELECT COUNT(*) AS participations
        FROM your_table_name
        GROUP BY memberid
    ) AS member_participations
    GROUP BY participations
) AS member_counts ON numbers.n = member_counts.participations
ORDER BY numbers.n ASC;

这样就能确保输出结果从1到24次完整覆盖,不会遗漏任何一个可能的参与次数。

最后记得把SQL里的your_table_name替换成你实际使用的数据表名称哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:25:29