题目描述:sql语句查询每个日期登录新用户个数,并且查询结果按照日期升序排序。
个人思路:new_user找出新用户的id和首登陆日。使用login left join new_user这样当有一天没有新用户时new_user表对应的null,null。因为count(null)=0,所以当日没有用户时,count(nu.user_id)=0
with new_user as
(
select user_id,min(date) as mdate
from login
group by user_id
)
select l.date,count(nu.user_id)
from login l left join new_user nu
on l.user_id=nu.user_id
and l.date=nu.mdate
group by l.date
order by l.date总结几个评论里亮眼的思路,跟他们比起来,我仿佛像个憨憨 (┭┮﹏┭┮):
sum()+窗口函数:
select t.date,
sum(case when t.t_rank =1 then 1 else 0 end) new
from
(
select date,
row_number() over(partition by user_id order by date) t_rank
from login
) t
group by t.daterow_number() 以user_id分组date升序连续排序,如1,2,3,4...。
t.t_rank =1 t表里排第一的必然是每个用户的首登陆日。
窗口函数里已经按date升序进行排序了,外表延用这个排序所以不需要再group by date。
case语句:
select date,
sum(
case when (user_id,date) in
(select user_id,min(date) from login group by user_id)
then 1 else 0 end
) new
from login
group by date
order by date这个几乎不需要解释。注意的是case语句结合IN的多字段使用。

京公网安备 11010502036488号