如何用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;
你原查询的问题说明
- 左连接条件错误:你用
DATEDIFF('2022-07-16', '2022-07-09')作为连接条件,这是一个固定数值,无法关联两个表的玩家ID,完全不符合逻辑 - 缺少时间段筛选:主查询和子查询都没有针对第1、2周的日期范围做过滤,导致数据范围完全错误
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

