DENSE_RANK() 函数的使用

SQL窗口函数dense_rank()用法 dense_rank()是一种窗口函数,它用于计算每个行的排序排名,并且如果存在两个或多个具有相同排序顺序的行,则会为它们分配相同的排名,并跳过下一个排名。这意味着如果有两个或多个行具有相同的排序值,则下一个排名将被跳过,以保持密集的排序。现在,我们想为每个月的每种产品计算销售额排名,以下是使用。子句将销售额按降序排序。子句将数据按月份和产品分组,然后使用。函数来为每个分区中的行计算密集排名。在这个查询中,我们使用。 阅读详情

业务场景:按月对每个工地状态进行评分, 满分一百分, 对每个工地评分后, 进行排名, 要求相同分数的工地排名相同

在我不知道DENSE_RANK()这个函数前, 我是对每个工地进行算分,所有工地是一个list , 工地的分数在list的map里。
如:[ { key:“工地1” , score:80 } , { key:“工地2”, score:90} , { key:“工地3”, score:60}]
在这样一个数组中, 对工地按评分排名, 其实就是把List数组按map中的某个属性进行排名。 但是这样有个问题, 就是说,相同分数的工地, 排名依然会有个先后顺序。
使用 DENSE_RANK() 可以在sql步骤就对数据进行排序, 不需要用代码进行排序。

select DZShare.T_Y_SCORE.total_score ,DZShare.T_Y_SCORE.time ,
ISNULL(DZShare.T_Y_SCORE.actual_score , 100) as actual_score  , DZShare.T_Y_SBBHDEVICE_SITE.work_site_name , 
DZShare.T_Y_SBBHDEVICE_SITE.country , DZShare.T_Y_SBBHDEVICE_SITE.id as sbbhSiteId , 
-- 这里使用DENSE_RANK() 
DENSE_RANK() over (order by actual_score desc ) rank from DZShare.T_Y_SBBHDEVICE_SITE left join DZShare.T_Y_SCORE
on  DZShare.T_Y_SBBHDEVICE_SITE.id = DZShare.T_Y_SCORE.sbbhdevice_id
and DZShare.T_Y_SCORE.time = '2021-11-01 00:00:00'
where 1=1
and DZShare.T_Y_SBBHDEVICE_SITE.country in ('临邑县' , '武城县')
and DZShare.T_Y_SBBHDEVICE_SITE.engineering_id in (1,2,3)
order by actual_score desc

使用方式:

select *  ,  DENSE_RANK() over (order by actual_score desc ) rank
from table
order by actual_score desc

over 中的写法和order by 子句保持一致。
排序效果如下:
在这里插入图片描述
可以看到, 当分数相同是, 排名rank也相同。
除了DENSE_RANK() , 相似的还有 RANK() 函数, 但 RANK() 是跳跃是排名。
什么是跳跃是排名? 我们把sql中的DENSE_RANK() 替换成 RANK() , 会得到如下结果:
在这里插入图片描述
当分值都是100 分的工地排名完成后,(都是第一名),然后从当前不是100分的工地位置开始排名计数。也就是分数是75的工地从46位置开始, 那么就从第46开始接着排名。

以上是使用sql进行排名, 那么使用代码进行排名,就是对List中的Map的某个属性进行排名, 当属性相同时,如何确保排名也相同呢?
1:首先定义一个排序方法,对list进行排序, 让list有序

    //降序排序
    class MapComparatorDesc implements Comparator<Map<String, Object>> {
        @Override
        public int compare(Map<String, Object> m1, Map<String, Object> m2) {
            Double v1 = Double.valueOf(m1.get("countryNumber").toString());
            Double v2 = Double.valueOf(m2.get("countryNumber").toString());
            if (v2 != null) {
                return v2.compareTo(v1);
            }
            return 0;
        }

    }
    // 对lsit进行排序
Collections.sort(tyScoreCountryList, new MapComparatorDesc());

然后对有序后的list , 按照map中的属性值, 给每个元素一个排名,具体如下:

        // 增加排名字段
        Map rankMap = new HashMap();
        Integer rank =0;
        for(int u=0; u<tyScoreCountryList.size(); u++)
        {
            String countryNumber = tyScoreCountryList.get(u).get("countryNumber").toString();
            if(rankMap.containsKey(countryNumber))
            {
                tyScoreCountryList.get(u).put("rank" , rank);
            }
            else {
                rank+=1;
                tyScoreCountryList.get(u).put("rank" ,rank);
                rankMap.put(countryNumber , null);
            }
        }

这里 countryNumber就是工地分数,在保证list是有序的前提下, 按判断分数在rankMap中存不存在来对List添加排名字段,可以实现对list的排名。

SQL笔记 | 分区函数PARTITION BY、RANK()、DENSE_RANK()的使用 目录 数据 RANK()求排名 求两个班所有人的排名 nulls last row_number()求排名 dense_rank()求排名 PARTITION BY分区函数 求两个班各自排名 PARTITION BY 与 GROUP BY区别 数据 各个班级数据表 id name class goal 1 小明 一班 100 2 小东 一班 90 3 小红 二班 95 4 小西 二班. 阅读详情

相关推荐

Swift Package Manager (SPM) 创建并集成本地库

Swift Package Manager (SPM) 在macOS 项目中创建并集成的完整步骤

征战无悔人生 1422

排序函数 dense_rank()

dense_rank() 对结果集进行排序,排名值没有间断。 特定行的排名等于该特定行之前不同排名值的数量加一。 语法: DENSE_RANK ( ) OVER ( [ <partition_by_clause> ] < order_by_clause > ) PARTITION BY 分组, ORDER BY 排序 举例:学生成绩表如下: 利用dense_rank(),按每门课程成绩的高低进行排序,sql如下: select dense_rank() over(part

miaomiaotiaopi的博客 3万+

从YOLOv8到RTDETR:如何将训练后的YOLO指标无缝转换为COCO格式

本文详细介绍了如何将训练后的YOLOv8指标无缝转换为COCO格式,特别适用于RTDETR模型的评估。通过数据准备、指标转换流程和实际项目经验,帮助开发者解决YOLO与COCO指标差异问题,提升模型评估的准确性和权威性。

weixin_29085151的博客 378

DENSE_RANK函数

SQL语句之DENSE_RANK函数,它是一个窗口函数,它为分区或结果集中的每一行分配排名,而排名值没有间隙。

四问四不知的博客 1万+

基于CANoe的车载以太网测试

以太网测试 CANoe

Yafet 4546

【嘉立创EDA】从AD21导入pcb边界到嘉立创EDA专业版

有许多前期工程由AD进行完成,在后续update的过程中,由于开模等原因限制,部分pcb外型需要继续沿用,本文将此过程记录,以供有需要的读者参考。

l64481000的博客 4516

DENSE_RANK()详解

DENSE_RANK()详解

monicateacat的博客 6944

使用 Simulink 实现基于相控阵雷达的波束形成技术

摘要:本文详细介绍了利用MATLAB Simulink和Phased Array System工具箱实现相控阵雷达波束形成的完整流程。主要内容包括:1)创建Simulink模型;2)设计天线阵列参数;3)信号生成模块配置;4)波束形成算法实现;5)结果可视化方法;6)仿真调试与优化;7)代码导出与部署。通过分步指导,读者可以掌握从理论到实践的完整开发流程,包括关键参数设置和算法实现示例。该方案适用于军事、气象等领域的雷达系统开发,并支持后续嵌入式和智能算法集成。

xiaoheshang_123的博客 179

分组排序函数、dense_rank() 函数的使用、MySQL之dense_rank()、Hive之dense_rank()函数

分组排序函数、dense_rank() 函数的使用、MySQL之dense_rank()、Hive之dense_rank()函数

weixin_49114503的博客 4077

AI智能体丨使用Coze生成自媒体短视频分镜生成器(附保姆级教程)

【短视频分镜脚本生成器】是一款由Coze平台开发出来的智能体,可快速解析某音/某书视频或本地文件,自动生成专业分镜脚本。用户只需输入视频链接或上传文件,系统即会分析镜头节奏、叙事逻辑和画面内容,输出包含画面、模板和话术参考的标准化脚本(支持3分钟内视频)。该工具还能生成HTML网页和可下载图片,提供可视化呈现。工作流程包括视频解析、帧提取、AI画面理解、脚本生成和网页制作,大幅提升短视频创作效率。

李同学Lino的博客 1532

ruoyi-nbcio-plus基于vue3的flowable服务任务的升级修改

ruoyi-nbcio-plus基于vue3的flowable服务任务的升级修改

宁波阿成的博客 846

sql—窗口函数rank()、dense_rank()的使用

窗口函数 简单理解就是rank()、dense_rank()用来获取排名,可以用partition by 来分组,order by 对某一字段的数据进行排名。 1、RANK() 在计算排序时,若存在相同位次,会跳过之后的位次。 例如,有3条排在第1位时,排序为:1,1,1,4······ 2、DENSE_RANK() 这就是题目中所用到的函数,在计算排序时,若存在相同位次,不会跳过之后的位次。 例如,有3条排在第1位时,排序为:1,1,1,2······ 语法: <窗口函数> OVER ( OR

qq_39181839的博客 1万+

Trae+雪球MCP,化身专业的股票分析师(玩转100个MCP系列第二弹)

大家好呀,我是程序员夏叶,深度AI编程使用者,专注于分享AI编程方面的使用技巧、经验以及前沿资讯,有兴趣的可以关注我的公众号,一起学习,共同进步。第二弹,使用Trae+雪球MCP,获取股票实时行情,分析股票走向等,写代码间隙看看股票价格,研究研究行情,哈哈。真的很不错呀,最关键的是,足够隐蔽,同事以为你在写代码,实际你在浏览股票行情,哈哈,感兴趣的可以试一下哦。说实话,沧州明珠这只股我算是砸手里了,不过还好买的不多,哈哈。

cpp加油站的专栏 517

Oracle 使用分析函数排名 rank()、dense_rank()、row_number() 使用详解

【语法】row_number() over( partition by col1 order by col2); 【功能】表示根据col1分组,在分组内部根据col2排序,而这个值就表示每组内部排序后的顺序编码(组内连续的 唯一的); row_number():返回的是行信息,没有排名; dense_rank():返回的相关等级不会跳跃; rank():返回的返回的相关等级会跳跃;   ...

li_tiantian的博客 1万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

mysql rankover函数_mysql窗口函数rank() over、dense_rank() over、row_number() over 使用心得...

一枚小产品的学习记录在做sql练习题时了解到的新函数,做个简要的记录,若有不严谨的地方,请指正。mysql 8.0以上版本才支持窗口函数以下是个人总结row_number()over(partition by字段1 order by 字段2) 的结果是每一行记录生成一个序号,依次排序且排序的序号不会重复rank()over(partition by字段1 order by 字段2) 的结果会考虑...

weixin_35064481的博客 1584

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

MSSQL 中窗口函数 OVER()使用dense_rank(),rank(),ROW_NUMBER()及统计函数说明

数据表TEST中数据为4个学生的三门课程成绩,如: 1、rank() 使用rank()函数,窗口函数over() 中order by 列如果出现重复,下一序号将跳过重复的笔数顺延 select *,rank() over(partition by subject order by sorce desc) from test 结果如下: 2、dense_rank() 使用dense_rank() 函数,窗口函数over() 中order by 列如果出现重复,下一序号将顺延 select

882

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

关于Oracle MAX()KEEP(DENSE_RANK LAST/FIRST ORDER BY ) 函数的使用分析

MAX()/MIN() KEEP(DENSE_RANK LAST/FIRST) 函数 解释: 1.max() 获取最大值; 2.min()获取最小值; 3.keep保持满足括号内条件的内容; 4.dense_rank 排序策略,连续排序,如果有两个同一级别时,接下来是第二级别 ,例如1,2,2,3 select names,dept,dense_rank() ov...

weixin_30367169的博客 457

MySQL使用窗口函数ROW_NUMBER()、DENSE_RANK()查询每组第一名或每组前几名,窗口函数使用详解

MySQL使用窗口函数ROW_NUMBER()、DENSE_RANK()查询每组第一名或每组前几名,窗口函数使用详解,MySQL窗口函数的使用语法,常见的窗口函数有哪些,窗口函数和聚合函数的区别

川子的博客 2457

低版本5.7mysql使用dense_rank() over..窗口函数的办法

在使用 dense_rank() over()、rank() over()、row_num() over() 三个函数时, SQL错误(1064) : You have an error in your sQLsyntax;原文链接:https://blog.youkuaiyun.com/Dfgghyyy/article/details/129714718。而此时我们需要使用DENSE_RANK() OVER(ORDER BY qz DESC)函数来在sql中进行排名计算。字符型,可带参数 : CHAR()

level_Tiller的博客 1956

SQL优化--使用分析函数 - row_number(),DENSE_RANK,RANK() ,NTILE

SQL优化--使用分析函数<br />  前段时间在 http://www.itput.net/  看到 一篇文章,<br />      http://www.itpub.net/thread-1031306-1-4.html<br />提到一个SQL语句:<br /> 建立环境:create table t_emp(id numeric(10)<br />   ,name varchar(10),<br /> salary numeric(10,2));<br />  插入数据:insert in

270

mysql自动排序函数dense_rank() over()、rank() over()、row_num() over()。使用函数时可能会报错:SQL错误(1064) : You have ....

三、在使用 dense_rank() over()、rank() over()、row_num() over() 三个函数时, SQL错误(1064) : You have an error in your sQLsyntax;

Dfgghyyy的博客 1898

over不能单独使用,要和分析函数:rank(),dense_rank(),row_number()等一起使用

From:http://blog.sina.com.cn/s/blog_4388a973010007lh.html RANK ( ) OVER ( [query_partition_clause] order_by_clause )DENSE_RANK ( ) OVER ( [query_partition_clause] order_by_clause )可实现按指...

weixin_30532369的博客 418

取得某列中第n大的行 使用dense_rank()函数

select column_name from (select table_name.*,dense_rank() over (order by column_name desc) rank from table_name) where rank = &N;

海仰望着天的专栏 310

关于排序rank () over , row_number() over ,rank_dense ()函数使用

转载地址:http://blog.youkuaiyun.com/michael_rjian/article/details/6230786      SQL语句中的rank () over , row_number() over ,rank_dense () 总结如下: 我创建了一个表,数据如下, SQL> select * from test;        A1       A2

小许在北京 457

窗口函数ROW_NUMBER()、RANK()、DENSE_RANK()的高效使用

NTILE(integer_expression):将有序分区中的行分发到指定数目的组中。各个组有编号,编号从一开始。对于每一个行,NTILE 将返回此行所属的组的编号。DENSE_RANK:返回结果集分区中行的排名,在排名中没有任何间断。行的排名等于所讨论行之前的所有排名数加一。ROW_NUMBER:返回结果集分区内行的序列号,每个分区的第一行从 1 开始。RANK:返回结果集的分区内每行的排名。行的排名是相关行之前的排名数加一。

chinasweet100的博客 399

Mysql 统计排名时使用函数rank() over,dense_rank() over,row_number() over

rank() over:查出指定条件后的进行排名。特点是,加入是对学生排名,使用这个函数,成绩相同的两名是并列,下一位同学空出所占的名次。 dense_rank() over:与ran() over的區别是,两名学生的成绩并列以后,下一位同学并不空出所占的名次。 row_number() over这个函数不需要考虑是否并列,哪怕根据条件查询出来的数值相同也会进行连续排名 使用rank() over的时候,空值是最大的,如果排序字段为null,可能造成null字段排在最前面,影响排序结果。可以这样:rank.

小鹏子的博客 709
上一篇: 对List中的map或bean的某个属性排序
下一篇: case when 的使用
libingbojava
博客等级 码龄9年 64粉丝 111原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值