题解 | #计算用户的平均次日留存率#
计算用户的平均次日留存率
https://www.nowcoder.com/practice/126083961ae0415fbde061d7ebbde453
select avg(if(datediff(date2,date1)=1, 1, 0)) as avg_ret from ( select distinct device_id, date as date1, lead (date, 1, null) over ( partition by device_id order by date ) as date2 from( select distinct device_id, date from question_practice_detail )as unique_id_qpd )as id_date_qpd
一、 if(判断,真,假) 函数
二、开窗函数:函数 + over(partition by <分组用列> order by <排序用列>)
*开窗函数不会互相干扰,因此在同一个查询语句中可以同时使用多个开窗函数
分为三类:
1、排序开窗函数
① row_number() -- 相同值排名顺延,返回结果1、2、3、4
② rank() -- 相同结果排名相同,后续排名不连续,返回结果为 1、2、2、4
③ dense_rank() -- 相同结果排名相同,后续排名顺延,返回结果为 1、2、2、3
④ ntile(n) -- 分组排名,将数据分为n组并返回对应组号1、2......n。
select grades, subjects, results, row_number() over ( partition by grades, subjects order by results desc ) as row_numbers, rank() over ( partition by grades, subjects order by results desc ) as ranks, dense_rank() over ( partition by grades, subjects order by results desc ) as dense_ranks, ntile (3) over ( partition by grades, subjects order by results desc ) as ntiles from test11 # 表示将数据集按照grades、subjects字段进行分组后,根据对应排序函数并按照results字段降序返回排名
2、聚合开窗函数
① sum() -- 分组求和
② count() -- 分组求总数
③ min() -- 分组求最小值
④ max() -- 分组求最大值
⑤ avg() --分组求均值
3、其他开窗函数
① lag(字段名,n,0) -- 移位开窗函数,表示返回向上第n行指定字段对应数据。其中n代表向上偏移n行,0代表若偏移行数超出表范围则返回0也可以改成其他值,若不写则默认null
② lead(字段名,n,0) -- 移位开窗函数,与lag()相反,表示返回向下第n行指定字段对应数据
③ first_value() -- 取分组内排序后,截止到当前行,第一个值
④ last_value() -- 取分组内排序后,截止到当前行,最后一个值
三、datediff()
语法 :DATEDIFF(datepart,startdate,enddate) 例子 :SELECT DATEDIFF(day,'2008-12-29','2008-12-30') AS DiffDate 结果:1 SELECT DATEDIFF(day,'2008-12-30','2008-12-29') AS DiffDate 结果:-1
SQL学习 文章被收录于专栏
个人学习的一些小总结