mysql窗口函数dense_rank() over(PARTITION BY...order by...desc)

1、dense_rank()排序相同时会重复,总数会减少,即会出现1、1、2这样的排序结果;
2、over: 在什么条件之上。
3、partition by分组与(group by)有着类似的意思,不同之处在于partition by会返回整组元素。
4、order by按字段排序。
例题
链接: 牛客268

描述

牛客每次举办企业笔试的时候,企业一般都会有不同的语言岗位,比如C++工程师,JAVA工程师,Python工程师,每个用户笔试完有不同的分数,现在有一个分数(grade)表简化如下:
在这里插入图片描述
第1行表示用户id为1的选择了language_id为1岗位的最后考试完的分数为12000,

第7行表示用户id为7的选择了language_id为2岗位的最后考试完的分数为11000,

不同的语言岗位(language)表简化如下:
在这里插入图片描述
请你找出每个岗位分数排名前2名的用户,得到的结果先按照language的name升序排序,再按照积分降序排序,最后按照grade的id升序排序,得到结果如下:

在这里插入图片描述

select
  id,
  name,
  score
from
  (
    select
      g.id,
      l.name,
      g.score,
      dense_rank() over(
        PARTITION BY l.name ##按照name进行分组
        order by
          g.score desc ##按积分从大到小排序
      ) d
    from
      grade g
      left join language l on l.id = g.language_id
  ) t ##这段sql返回参数有id,name,score和d,其中d是数据在对应组中的排名
where
  d <= 2 ##排名小于等于2则表明是前2的数据
order by
  name,
  score desc,
  id
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值