四时宝库

程序员的知识宝库

SQL面试经典问题-开窗函数

  • 分组取每组最大值

  • 案例:按课程号分组取成绩最大值所在行的数据

    select 
        学号,
        课程号,
        max(成绩) as 最高分,   
    from a
    group by 课程号


  • 分组取每组最小值
  • 案例:按课程号分组取成绩最小值所在行的数据(意思是每个课程最小值的学生信息都要出来)

    关联子查询

    select * from score a
    where 成绩=(
    select min(成绩) from score b
    where b.课程号=a.课程号
    )


    查询各科成绩前两名的记录(topN),一定要嵌套一层,不能直接取,因为where比select先执行

    select *
    from (select 
                *,
                dense_rank() over (partition by ID  order by score desc) as 排名
           from
           score)t
    where t.排名<=2


    查找单科成绩高于该科目平均成绩的学生名单

    第一种解法

    select 姓名
    from 
        成绩表
        left join 
        (select 科目,
            avg(score) as 平均成绩
         from 成绩表
        group by 科目)t
    where 成绩表.成绩>t. 平均成绩

    第二种解法

    select * from (
    select *,
    avg(成绩) over (
    PARTITION by 课程号) as 平均成绩
    from score)as a
    where 成绩>平均成绩

    发表评论:

    控制面板
    您好,欢迎到访网站!
      查看权限
    网站分类
    最新留言
      友情链接