首页
学习
活动
专区
圈层
工具
发布

mysql有dense rank

基础概念

DENSE_RANK() 是 MySQL 中的一个窗口函数,用于为结果集中的每一行分配一个唯一的、连续的排名值。与 RANK() 函数不同,DENSE_RANK() 在遇到相同值时不会跳过排名。

相关优势

  1. 连续排名DENSE_RANK() 确保排名是连续的,不会因为相同值而产生间隔。
  2. 适用于分析:在数据分析和报表生成中,DENSE_RANK() 可以帮助识别数据中的趋势和模式。

类型

DENSE_RANK() 是一个窗口函数,属于 MySQL 中的聚合函数类别。

应用场景

  1. 销售排名:根据销售额对销售人员进行排名,相同销售额的销售人员获得相同的排名。
  2. 学生成绩排名:根据学生的考试成绩进行排名,相同分数的学生获得相同的排名。
  3. 产品排名:根据产品的销量进行排名,相同销量的产品获得相同的排名。

示例代码

假设有一个销售数据表 sales,结构如下:

代码语言:txt
复制
CREATE TABLE sales (
    id INT PRIMARY KEY,
    salesperson VARCHAR(50),
    amount DECIMAL(10, 2)
);

插入一些示例数据:

代码语言:txt
复制
INSERT INTO sales (id, salesperson, amount) VALUES
(1, 'Alice', 1000),
(2, 'Bob', 1500),
(3, 'Charlie', 1500),
(4, 'David', 2000),
(5, 'Eve', 2000);

使用 DENSE_RANK() 进行排名:

代码语言:txt
复制
SELECT 
    salesperson, 
    amount, 
    DENSE_RANK() OVER (ORDER BY amount DESC) AS rank
FROM sales;

输出结果:

代码语言:txt
复制
salesperson | amount   | rank
------------|----------|------
David       | 2000.00  | 1
Eve         | 2000.00  | 1
Bob         | 1500.00  | 2
Charlie     | 1500.00  | 2
Alice       | 1000.00  | 3

常见问题及解决方法

问题:为什么 DENSE_RANK() 在某些情况下没有按预期工作?

原因:可能是由于窗口函数的顺序或分组设置不正确。

解决方法

确保 OVER() 子句中的 ORDER BY 子句正确指定了排序的列和顺序。例如:

代码语言:txt
复制
DENSE_RANK() OVER (ORDER BY amount DESC)

如果需要对特定分组进行排名,可以使用 PARTITION BY 子句:

代码语言:txt
复制
DENSE_RANK() OVER (PARTITION BY department ORDER BY amount DESC)

参考链接

通过以上信息,你应该对 DENSE_RANK() 函数有了全面的了解,并能够在实际应用中正确使用它。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

区分函数 ROW_NUMBER(), RANK(), and DENSE_RANK()

今天给大家推送第一篇SQL文章《辨析函数 ROW_NUMBER(), RANK(), and DENSE_RANK() 》,接下来所讨论的全部内容都是基于ORACLE数据库 其实这三个函数的区别很容易记住...() OVER(ORDER BY ref_var) as rank, DENSE_RANK() OVER(ORDER BY ref_var) as dense_rank FROM refer_tableORDER...BY 1, 2 得到下面的结果 ref_var row_number rank dense_ranka 1 1 1 a 2 1 1 a 3...(), and DENSE_RANK() 区别做如下总结: row_number ()在进行排序的时候,针对相同的元素,会赋予不同的序号值,且序号值是唯一不重复并且是连续的。...3. dense_rank()排序的时候,针对相同元素(a,a,a),会赋予相同的序号值1, 紧接着对元素b赋值是2,也就是序号值是连续可重复的。

1.1K30
  • Oracle分析函数四——函数RANK,DENSE_RANK,FIRST,LAST…

    若两行序数为1,则没有序数2,序列将给组中的下一行分配值3,DENSE_RANK则没有任何跳跃。...SAMPLE:下例中计算每个员工按部门分区再按薪水排序,依次出现的序列号(注意与DENSE_RANK函数的区别) DENSE_RANK 功能描述:根据ORDER BY子句中表达式的值,从查询返回的每一行...有同样值的行得到同样的数字序号(认为null时相等的)。...DENSE_RANK() OVER (ORDER BY salary) AS DENSE_RANK_ORDER FROM employees 代码如下: SELECT department_id...DENSE_RANK_PART_ORDER FROM employees FIRST 功能描述:从DENSE_RANK返回的集合中取出排在最前面的一个值的行(可能多行,因为值可能相等),因此完整的语法需要在开始处加上一个集合函数以从中取出记录

    2K10

    Oracle-分析函数之排序值rank()和dense_rank()

    概述 ORACLE函数系列: Oracle常见函数大全 Oracle-分析函数之连续求和sum(…) over(…) Oracle-分析函数之排序值rank()和dense_rank() Oracle-...] order_by_clause ) 【功能】聚合函数RANK 和 dense_rank 主要的功能是计算一组数值中的排序值。...【参数】dense_rank与rank()用法相当 【区别】dence_rank在并列关系是,相关等级不会跳过。...rank则跳过. rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内) dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。...---- dense_rank() dense_rank与rank()用法相当,但是有一个区别:dence_rank在并列关系是,相关等级不会跳过。rank则跳过.

    1.3K20

    sql 四大排名函数—(ROW_NUMBER、RANK、DENSE_RANK、NTILE)简介

    2.RANK() 定义:RANK()函数,顾名思义排名函数,可以对某一个字段进行排名,这里为什么和ROW_NUMBER()不一样那,ROW_NUMBER()是排序,当存在相同成绩的学生时,ROW_NUMBER...RANK()是 1 2 2,而ROW_NUMBER()则还是1 2 3,这就是RANK()和ROW_NUMBER()的区别了 3.DENSE_RANK() 定义:DENSE_RANK()函数也是排名函数...,和RANK()功能相似,也是对字段进行排名,那它和RANK()到底有什么不同那?...看例子: 实例: DENSE_RANK()密集的排名他和RANK()区别在于,排名的连续性,DENSE_RANK()排名是连续的,RANK()是跳跃的排名,所以一般情况下用的排名函数就是RANK()。...4.NTILE() 定义:NTILE()函数是将有序分区中的行分发到指定数目的组中,各个组有编号,编号从1开始,就像我们说的’分区’一样 ,分为几个区,一个区会有多少个。

    31.4K34

    MySQL实现Oracle rank()排序

    本文链接:https://blog.csdn.net/u014427391/article/details/100898845 一、Oracle写法介绍 MySQL5.7版本没有提供类似Oracle的分析函数...,比如开窗函数over(…),oracle开窗函数over(…)使用的话一般是和order、partition by、row_number()、rank()、dense_rank()几个函数一起使用,具体的用法可以参考我之前的博客...所以网上这种写法也是值得学习的,一种是利用了mysql的执行计划执行顺序对临时变量进行赋值,然后再用临时变量进行叠加,写法还是值得学习的 对于临时变量的知识点,可以参考我之前博客:MySQL变量学习笔记...MySQL实现的效果: ? Oracle实现的效果: ?...所以,对于Oracle rank()、row_number加上开窗函数进行排序,并没有partition by分组的时候,是可以用这种方法,不过写法要改一下,代码如: SELECT /* IF(

    1.5K40

    MySQL系列之实现Oracle rank()排序

    一、Oracle写法介绍 MySQL5.7版本没有提供类似Oracle的分析函数,比如开窗函数over(…),oracle开窗函数over(…)使用的话一般是和order、partition by、row_number...()、rank()、dense_rank()几个函数一起使用,具体的用法可以参考我之前的博客oracle开窗函数用法简介 假如要获取成绩排序第一的学生信息,可以用如下的SQL: select * from...) over(partition by classId order by score desc) rn from t_score) where rn = 1; 二、Oracle和MySQL...的执行计划执行顺序对临时变量进行赋值,然后再用临时变量进行叠加,写法还是值得学习的 对于临时变量的知识点,可以参考我之前博客:MySQL变量学习笔记 注意:这里网上有很多这种写法,不过我验证了,并不能实现了...所以,对于Oracle rank()、row_number加上开窗函数进行排序,并没有partition by分组的时候,是可以用这种方法,不过写法要改一下,代码如: SELECT /* IF(

    95410

    SQL进阶-3-排序与窗口函数

    SQL进阶-3-排序和窗口函数 在使用数据库制作各种统计数据的时候,需要对数据进行排序,比如按照分数、销量、人数等数值进行排序,通常排序的方法有两种: 跳过之后的位次排序 不跳过之后的位次排序 ?.../row_number 实例 rank:并列跳跃排名 dense_rank:并列连续排名 row_number:连续排名 这3个函数的区别通过一个列子可以清楚地看到: ?...select name,price, rank() over (order by price desc) as rank_1, dense_rank() (order by price desc)...非等值连接实现dense_rank() mysql> select p1.name, p1.price, (select count(distinct p2.price) from products...使用变量实现row_number() 在MySQL5.7.28中实现变量实现row_number函数的功能 mysql> select p.name, p.price, (@pro_rank := @pro_rank

    1.3K20
    领券