题目描述: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.date
row_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的多字段使用。