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

如何用SQL统计指定日期区间内的新增男性玩家数量

正确SQL解决方案

需求回顾

统计2022年第2周(07/08/2022-07/15/2022)出现,但第1周(07/01/2022-07/07/2022)未出现的男性玩家数量。

方法一:使用NOT EXISTS子查询(逻辑直观,类似Excel反向匹配)

这种写法和你用Excel VLOOKUP找“不存在”的逻辑一致,先锁定目标范围,再排除在另一范围出现过的记录:

SELECT COUNT(DISTINCT dp.playerid)
FROM daily_player dp
WHERE dp.gender = 'M'
  -- 筛选第2周的记录
  AND dp.date BETWEEN '07/08/2022' AND '07/15/2022'
  -- 排除第1周出现过的玩家
  AND NOT EXISTS (
    SELECT 1
    FROM daily_player dp_prev
    WHERE dp_prev.playerid = dp.playerid
      AND dp_prev.date BETWEEN '07/01/2022' AND '07/07/2022'
  );
  • 外层查询先圈定第2周的男性玩家
  • NOT EXISTS子查询检查当前玩家是否在第1周有过记录,无记录则保留
  • COUNT(DISTINCT playerid)确保同一个玩家在第2周多次登录不会被重复计数

方法二:左连接筛选NULL(修正你尝试的左连接思路)

如果你更习惯用连接的方式,先分别提取两个时间段的玩家列表,再通过左连接筛选出仅在第2周出现的玩家:

SELECT COUNT(DISTINCT dp2.playerid)
FROM (
  -- 提取第2周的男性玩家(去重避免重复计数)
  SELECT DISTINCT playerid
  FROM daily_player
  WHERE gender = 'M'
    AND date BETWEEN '07/08/2022' AND '07/15/2022'
) dp2
LEFT JOIN (
  -- 提取第1周所有出现过的玩家
  SELECT DISTINCT playerid
  FROM daily_player
  WHERE date BETWEEN '07/01/2022' AND '07/07/2022'
) dp1 ON dp2.playerid = dp1.playerid
-- 筛选出第1周没有匹配到的玩家
WHERE dp1.playerid IS NULL;

你原查询的问题说明

  1. 左连接条件错误:你用DATEDIFF('2022-07-16', '2022-07-09')作为连接条件,这是一个固定数值,无法关联两个表的玩家ID,完全不符合逻辑
  2. 缺少时间段筛选:主查询和子查询都没有针对第1、2周的日期范围做过滤,导致数据范围完全错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 13:36:29