- 使用lead函数和dense_rank函数,这个方法写起来最简单也容易理解,而且运行效率还比较高(配合next_day!=date条件和dense_rank()函数,能解决重复登录问题;其他答案多使用row_number()函数,这是不正确的,配到重复登录情况必出错)
select date,
ifnull(
round(
sum( case when r=1 and timestampdiff(day,date,next_day)=1 then 1 else 0 end)
/
sum(case when r=1 and next_day!=date then 1 else 0 end)
,3)
,0) as p
from
(select user_id,date
,lead(date,1) over(partition by user_id order by date) next_day
,dense_rank() over(partition by user_id order by date) r
from login)b
group by date



京公网安备 11010502036488号