SQL 每天新的不同用户

SQL for new distinct users pers day

我的 SQL 有点生锈了,我花了太长时间试图解决这个问题,所以我想在这里问一下:)

我正在尝试获取每天访问我的网站的不同新用户的数量 UI。我有关于每月活跃用户的目标,并且想跟踪我如何逐月到达这个月。例如,我想查看我在 1 月 16 日有多少不同用户,并将其与 2 月 16 日进行比较。

我的第一个问题是如何获取每天的新用户数。我希望在每个月的第一天有一个更高的数字,随着月份的继续它会减少。

我的SQL是:

select day, count(distinct(user)) as distinct_users
from mytable
where year = 2020 and month = 2
group by day
order by day desc

但这并不能去除重复的。例如,如果我在 2 天内访问了该网站并登录了 mytable,那么我将在这两天使用上面的 SQL 出现。理想情况下我只想出现在我出现在 mytable

的第一天

考虑 mytable 有这个

day  user
----------
1    richard
1    paul
1    alexis
2    richard
2    david

我想查询 return

day   cnt
----------
1     3    (richard, paul, alexis)
2     1    (david - no richard as he has already been returned)

如何删除已经出现的用户?

谢谢

您可以获得每个用户的最早日期,然后在最早的日期上进行聚合。

select t1.day,count(distinct t.user) as cnt
from (select user,min(day) as minday
      from tbl
      group by user
     ) t 
left join tbl t1 on t1.day = t.minday -- to get days with no new users as well
group by day
order by day

您可以使用两个聚合级别来执行此操作:

select day, count(*) cnt
from (select min(day) day from mytable group by user) t
group by day
order by day

Demo on DB Fiddle:

day | cnt
--: | --:
  1 |   3
  2 |   1

无需在外部查询中再次加入原始 table:这会使查询成本更高,而不会增加重要价值。