个人感觉十分的简洁 select round(sum(p1)/count(distinct user_id),3) p from ( select *,if(date=date_add(d1,interval 1 day),1,0) p1 from (select *,first_value(date)over(partition by user_id order by date) d1 from login) lo1 ) lo2;