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
day | cnt
--: | --:
1 | 3
2 | 1
无需在外部查询中再次加入原始 table:这会使查询成本更高,而不会增加重要价值。
我的 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
day | cnt --: | --: 1 | 3 2 | 1
无需在外部查询中再次加入原始 table:这会使查询成本更高,而不会增加重要价值。