题解 | #计算用户的平均次日留存率#

计算用户的平均次日留存率

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学习 文章被收录于专栏

个人学习的一些小总结

全部评论

相关推荐

03-12 11:54
门头沟学院 Java
dghyuiok:佬太厉害了,我也27双非,只会黑马商城和苍穹外卖,靠这两个烂大街项目,装成大三面了4个一个没中
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务