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