• SQL开窗函数 row_number(),dense_rank(), rank()


    一、背景知识

    ROW_NUMBER() 不允许并列且不留空,如: 1,2,3,...

    RANK()允许并列且留空 ,学生考试排名的排序方法,如:1,1,3,...

    DENSE_NUMBER() 允许并列且不留空,如: 1,1,2,2,3,...

    二、说明

    row_number(),无参函数,括号不能省略

     观察发现第二个窗口的第1,2行amount值相等都为800,但排名不是并列第一,

    为实现并列排名dense_rank() 排名序号连续,rank()函数排名序号不连续

    对比如下:

    注意where子句中不能使用开窗函数和聚合运算,所以用表子查询完成筛选,特别主要表子查询对表必须起别名,where才能引用排名字段

     

    三、题例

     找到每类试卷得分的前3名,如果两人最大分数相同,选择最小分数大者,如果还相同,选择uid大者。

    select tag,uid,ranking 
    from(
        SELECT tag,uid,
            row_number() over(partition by tag order by max(score) desc,min(score) desc,max(uid) desc) as ranking  #可以在开窗函数里使用聚合函数
        from exam_record 
        left join examination_info using(exam_id)
        where submit_time is not null
        group by tag,uid) as t
    where ranking in (1,2,3)
    ;

    examination_info表:

    exam_record表:

  • 相关阅读:
    定时器应用-最终版
    定时器应用-点击按钮,div向右移动
    通过js读取元素的样式
    延时调用
    定时器应用-切换图片的练习
    BOM对象属性定时器的调用
    BOM浏览器对象模型
    键盘移动
    Python-字符串方法
    Python实现注册和登录
  • 原文地址:https://www.cnblogs.com/xuwinwin/p/15812004.html
Copyright © 2020-2023  润新知