MySQL:获取每日新增未出现过的唯一邮箱数量
解决每日新增唯一邮箱统计问题
嘿,我明白你的需求了——你现在的SQL只是统计了每天出现的去重邮箱数,但没有排除那些之前已经出现过的邮箱,所以结果和预期不符。我们需要的是首次在当日出现的邮箱数量,也就是真正的“每日新增”。
这里有两种简单有效的解决方案:
方法一:使用窗口函数标记首次出现日期
通过窗口函数MIN() OVER (PARTITION BY email)给每个邮箱打上它首次出现的日期标签,然后筛选出当日等于首次日期的记录,再分组统计:
SELECT COUNT(DISTINCT email) AS count, created_at FROM ( SELECT email, created_at, -- 标记每个邮箱的首次出现日期 MIN(created_at) OVER (PARTITION BY email) AS first_appear_date FROM test_table ) t -- 只保留当日就是首次出现的记录 WHERE created_at = first_appear_date GROUP BY created_at ORDER BY created_at;
方法二:先获取每个邮箱的首次出现日期再统计
先按邮箱分组,找出每个邮箱最早出现的日期,再按这个日期分组计数,逻辑更直观:
SELECT COUNT(email) AS count, first_appear_date AS created_at FROM ( -- 先拿到每个邮箱的首次出现日期 SELECT email, MIN(created_at) AS first_appear_date FROM test_table GROUP BY email ) t GROUP BY first_appear_date ORDER BY first_appear_date;
验证结果
根据你的测试数据:
test1、test2、test3首次出现在2018-01-01 → 当日计数3test4首次出现在2018-01-02 → 当日计数1test5首次出现在2018-01-03 → 当日计数1
这两个查询都会返回你期望的结果:
| count | created_at |
|---|---|
| 3 | 2018-01-01 |
| 1 | 2018-01-02 |
| 1 | 2018-01-03 |
内容的提问来源于stack exchange,提问作者Satyanarayana swamy
相关产品推荐
相关产品推荐

