MySQL - 考虑到之前的所有日子,计算每天的唯一用户数
MySQL - Count unique users each day considering all previous days
我想计算数据库在记录的所有天数中每天获得多少新的唯一用户。
每天不会有任何重复的ID,但多天会有重复。
如果我的 table 看起来像这样:
ID | DATE
---------
1 | 2022-05-21
1 | 2022-05-22
2 | 2022-05-22
1 | 2022-05-23
2 | 2022-05-23
1 | 2022-05-24
2 | 2022-05-24
3 | 2022-05-24
我希望结果如下所示:
DATE | NEW UNIQUE IDs
---------------------------
2022-05-21 | 1
2022-05-22 | 1
2022-05-23 | 0
2022-05-24 | 1
查询如:
SELECT `date` , COUNT( DISTINCT id)
FROM tbl
GROUP BY DATE( `date` )
会return按天计算,不会考虑前几天。
如有任何帮助,我们将不胜感激。
编辑:使用 MySQL 8
从显示每个 ID 出现的最早日期的子查询开始。
SELECT MIN(`date`) `firstdate`, id
FROM tbl
GROUP BY id
然后计算该子查询。 here.
SELECT firstdate, COUNT(*)
FROM (
SELECT MIN(`date`) `firstdate`, id
FROM tbl
GROUP BY id
) m
GROUP BY firstdate
这给了你你想要的。
但它没有新用户 ID 首次出现的日期行。
当日期是该用户的最少日期时,该用户是新用户。
所以你需要像
这样的东西
SELECT date, COUNT(new_users.id)
FROM calendar
LEFT JOIN ( SELECT id, MIN(date) date
FROM test
GROUP BY id ) new_users USING (date)
GROUP BY date
calendar
是静态的或动态生成的 table 以及所需的日期列表。它甚至可以是 SELECT DISTINCT date FROM test
子查询。
只计算(和求和)左连接失败的行:
SELECT
m1.`DATE` ,
sum(CASE WHEN m2.id is null THEN 1 ELSE 0 END) as C
FROM mytable m1
LEFT JOIN mytable m2 ON m2.`DATE`<m1.`DATE` AND m2.ID=m1.ID
GROUP BY m1.`DATE`
参见:DBFIDDLE
我想计算数据库在记录的所有天数中每天获得多少新的唯一用户。 每天不会有任何重复的ID,但多天会有重复。
如果我的 table 看起来像这样:
ID | DATE
---------
1 | 2022-05-21
1 | 2022-05-22
2 | 2022-05-22
1 | 2022-05-23
2 | 2022-05-23
1 | 2022-05-24
2 | 2022-05-24
3 | 2022-05-24
我希望结果如下所示:
DATE | NEW UNIQUE IDs
---------------------------
2022-05-21 | 1
2022-05-22 | 1
2022-05-23 | 0
2022-05-24 | 1
查询如:
SELECT `date` , COUNT( DISTINCT id)
FROM tbl
GROUP BY DATE( `date` )
会return按天计算,不会考虑前几天。
如有任何帮助,我们将不胜感激。
编辑:使用 MySQL 8
从显示每个 ID 出现的最早日期的子查询开始。
SELECT MIN(`date`) `firstdate`, id
FROM tbl
GROUP BY id
然后计算该子查询。 here.
SELECT firstdate, COUNT(*)
FROM (
SELECT MIN(`date`) `firstdate`, id
FROM tbl
GROUP BY id
) m
GROUP BY firstdate
这给了你你想要的。
但它没有新用户 ID 首次出现的日期行。
当日期是该用户的最少日期时,该用户是新用户。
所以你需要像
这样的东西SELECT date, COUNT(new_users.id)
FROM calendar
LEFT JOIN ( SELECT id, MIN(date) date
FROM test
GROUP BY id ) new_users USING (date)
GROUP BY date
calendar
是静态的或动态生成的 table 以及所需的日期列表。它甚至可以是 SELECT DISTINCT date FROM test
子查询。
只计算(和求和)左连接失败的行:
SELECT
m1.`DATE` ,
sum(CASE WHEN m2.id is null THEN 1 ELSE 0 END) as C
FROM mytable m1
LEFT JOIN mytable m2 ON m2.`DATE`<m1.`DATE` AND m2.ID=m1.ID
GROUP BY m1.`DATE`
参见:DBFIDDLE