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