zoukankan      html  css  js  c++  java
  • 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表:

  • 相关阅读:
    最好的云备份选项
    不要让你的云备份策略退居次位
    了解区域类型
    Managing WMI security
    创建、导入、导出、复制以及粘贴 WMI 筛选器
    Gpfixup
    centos 7 安装MySQL 5.7.23
    centos 7 配置 mysql 5.7 主从复制
    oracle DG搭建
    undo表空间丢失、损坏
  • 原文地址:https://www.cnblogs.com/xuwinwin/p/15812004.html
Copyright © 2011-2022 走看看