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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MySQL中的DENSE_RANK函数是一种排名函数,用于计算结果集中每行的排名。与RANK函数不同的是,DENSE_RANK函数不会跳过排名相同的行,而是将它们视为同一排名,并为它们分配相同的排名值。DENSE_RANK函数的语法如下: DENSE_RANK() OVER ( [PARTITION BY partition_expression, ... [n]] ORDER BY sort_expression [ASC | DESC], ... [n] ) 其中,PARTITION BY子句用于指定分区列,ORDER BY子句用于指定排序列。DENSE_RANK函数返回一个整数值,表示当前行的排名。 ### 回答2: MySQL中的DENSE_RANK函数是常用的窗口函数之一。它可以在给定排序条件的情况下,返回一个排名值列,其中相同值具有相同的排名值,而下一个不同的值将具有一个新的排名值。 DENSE_RANK函数的语法如下: ``` DENSE_RANK() OVER ( [PARTITION BY partition_expression, ... ] ORDER BY sort_expression [ASC|DESC], ... ) ``` 其中,PARTITION BY子句是可选的,可以定义一个或多个分区表达式,这些表达式将数据集分为多个分区进行排名。ORDER BY子句是必需的,用于指定排序条件,可以指定一个或多个排序表达式,以及一个可选的排序方向(ASC或DESC)。 DENSE_RANK函数返回的值是排名值。相同的数据将具有相同的排名值,而数据集中不同的下一个值将具有一个新的排名值。例如,如果有三个人的成绩如下:90、90、85,它们的排名值将是1、1、2,因为有两个人获得了相同的最高分。 需要注意的是,DENSE_RANK是一个窗口函数,它需要使用OVER子句进行使用。窗口函数可以对整个数据集或数据集的子集进行计算, DENSE_RANK 需要进行排序,因此需要将排序条件作为子句的一部分。另外,DENSE_RANK只能在MySQL8.0版本以上使用。 总之,DENSE_RANK函数是一个非常有用的函数,可以轻松处理需要对数据进行排名的情况。它可以帮助我们更好地理解数据集,找到最高或最低的值,以及在数据集中确定某个值的相对位置。 ### 回答3: MySQL中的DENSE_RANK(密集排名)函数是一种用来对查询结果的行进行排名的窗口函数。与传统的RANK函数不同的是,DENSE_RANK函数不会跳过相同排名的行,而是给相同排名的行赋相同的排名值。 语法: DENSE_RANK() OVER (ORDER BY column_name) 其中,column_name是用于排序的列名。 举个例子,假设有如下一张学生成绩表: | name | subject | score | |------|---------|-------| | Tom | Math | 80 | | Tom | English | 70 | | Jack | Math | 90 | | Jack | English | 80 | | Lucy | Math | 70 | | Lucy | English | 90 | | Ben | Math | 80 | | Ben | English | 80 | 如果我们想对每个学生的总成绩排名,并且让排名相同的学生排名值相同,可以使用以下查询: SELECT name, SUM(score) as total_score, DENSE_RANK() OVER (ORDER BY SUM(score) DESC) as rank FROM table_name GROUP BY name ORDER BY rank 输出结果如下: | name | total_score | rank | |------|-------------|------| | Jack | 170 | 1 | | Ben | 160 | 2 | | Tom | 150 | 3 | | Lucy | 160 | 2 | 可以看到,在排名第二名的Ben和Lucy中,由于成绩相同,它们的排名值也相同。 总之,DENSE_RANK函数是一种非常实用的函数,可以在需要对排名值相同的行进行特定操作时使用。它与其他窗口函数一起,为我们提供了更大的灵活性和功能性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值