SQL窗口函数实战_ROW_NUMBER_RANK_DENSE_RANK
📅 2026/7/29 14:37:50
👁️ 次浏览
SQL窗口函数实战ROW_NUMBER、RANK、DENSE_RANK 到底该用哪个这篇文章不是教科书是我当年做数据分析时踩过坑后的总结先把最容易搞混的三个窗口函数讲清楚。做数据分析那会儿我特别喜欢用窗口函数。倒不是因为它多高级而是有些需求用它写起来太顺手了——比如每个分组取前 N 条“累计求和”“排名次”。但说实话我刚开始学的时候也晕过。ROW_NUMBER、RANK、DENSE_RANK三个名字长得差不多出来的结果老是差那么一点点。今天就用一个学生成绩表把这三个函数彻底讲明白。先建一张学生成绩表CREATETABLEscores(score_idINTPRIMARYKEY,class_nameVARCHAR(20),student_nameVARCHAR(20),scoreINT);INSERTINTOscoresVALUES(1,一班,张三,90),(2,一班,李四,85),(3,一班,王五,90),(4,一班,赵六,78),(5,二班,孙七,92),(6,二班,周八,88),(7,二班,吴九,92),(8,二班,郑十,76);注意一班有两个 90 分二班也有两个 92 分。这种并列分数是后面讲排名的关键。1. ROW_NUMBER最简单的排名并列也硬排需求按班级给学生成绩排名每个班排一名。SELECTclass_name,student_name,score,ROW_NUMBER()OVER(PARTITIONBYclass_nameORDERBYscoreDESC)ASrnFROMscores;结果大概长这样class_namestudent_namescorern一班张三901一班王五902一班李四853一班赵六784看到没两个 90 分张三排第 1王五排第 2。ROW_NUMBER 不管并列硬生生给每个人一个唯一编号。我什么时候用它取每个班第一名的时候最干净。因为 ROW_NUMBER 不会并列所以用WHERE rn 1永远不会出现多条结果。SELECT*FROM(SELECTclass_name,student_name,score,ROW_NUMBER()OVER(PARTITIONBYclass_nameORDERBYscoreDESC)ASrnFROMscores)tWHERErn1;踩坑记录有一次我做每个区最新一条数据用了 RANK结果同一个区出来了两条一样的记录下游去重搞了半天。后来改成 ROW_NUMBER 才干净。2. RANK真正的比赛排名并列跳号同样是按班级排名但用 RANKSELECTclass_name,student_name,score,RANK()OVER(PARTITIONBYclass_nameORDERBYscoreDESC)ASrkFROMscores;class_namestudent_namescorerk一班张三901一班王五901一班李四853一班赵六784两个 90 分并列第 1下一名直接跳到第 3。这就是体育比赛里的排名逻辑——两个冠军没有亚军。我什么时候用它做比赛排名榜单这种场景。比如公司销售业绩排名两个销售并列第一那第三名就是第三名没有第二名。3. DENSE_RANK并列不跳号SELECTclass_name,student_name,score,DENSE_RANK()OVER(PARTITIONBYclass_nameORDERBYscoreDESC)ASdrFROMscores;class_namestudent_namescoredr一班张三901一班王五901一班李四852一班赵六783两个 90 分并列第 1下一名是第 2。我什么时候用它做等级划分。比如成绩前 2 名的同学评优如果按 DENSE_RANK两个 90 分都算第 1 等级85 分算第 2 等级。这样更符合按成绩档次而不是按名次的需求。一张表看懂三个函数的区别函数并列怎么处理是否跳号典型使用场景ROW_NUMBER硬排不并列不跳取每组前 N 条要求唯一RANK并列同一名次跳号比赛排名、榜单DENSE_RANK并列同一名次不跳号等级划分、档次分组4. 窗口函数里最容易漏的PARTITION BY很多人第一次写窗口函数会写成这样-- 错的写法没有 PARTITION BY所有数据一起排名SELECTstudent_name,score,ROW_NUMBER()OVER(ORDERBYscoreDESC)ASrnFROMscores;这样出来的结果是所有学生混在一起排名不分班级。如果你要的是每个班内部排名必须加PARTITION BY class_name。-- 对的写法SELECTstudent_name,score,ROW_NUMBER()OVER(PARTITIONBYclass_nameORDERBYscoreDESC)ASrnFROMscores;我的经验是先想清楚你的窗口范围是什么再把 PARTITION BY 写上去。窗口范围是整个表还是一个组这个想错了结果一定不对。5. 实战取每个班级前 2 名这个需求在面试和实际工作中都很常见。用 ROW_NUMBER 最稳SELECT*FROM(SELECTclass_name,student_name,score,ROW_NUMBER()OVER(PARTITIONBYclass_nameORDERBYscoreDESC)ASrnFROMscores)tWHERErn2;如果需求是每个班成绩前 2 个档次那就用 DENSE_RANK如果是比赛前三用 RANK。课后练习下面这三道题你自己敲一遍比看十遍都强练习 1查询每个班级成绩最高的学生只取 1 人并列时任意取一个。练习 2查询每个班级排名前 2 的学生并列时都要列出来。练习 3给每个班级学生的成绩划分等级前 1/3 为 A中间 1/3 为 B后 1/3 为 C提示用 NTILE(3)。答案我放在评论区做完再对照。写在最后窗口函数看起来就那几个关键字但真正用好关键是要想清楚你的窗口在哪里。是先分组PARTITION BY再排序还是直接全局排序是要唯一编号、跳跃排名还是连续排名我刚工作的时候最怕的不是不会写而是三个函数长得像、用法又像最后选错了还不知道。希望这篇文章能帮你把这三个一次分清楚。下一篇我打算写窗口函数里的累计求和与滑动平均——做时间序列分析时离不开。如果你也有想聊的 SQL 话题评论区告诉我。
本文关键词:geo2r中logFC绝对值小于2昨晚熬夜跑数据,今早起来一看结果,心态直接崩了。明明觉得两组样本差异挺大的,怎么筛选出来那些基因,logFC绝对值全都在2以下?甚至有好几个才0.5左右。我当时第一反应就是:是不是我参数设错了?还是说这个geo2r工具本身就不靠谱?说实…
📅 2026/7/29 14:36:44
3大突破!Windows原生运行Android应用的优雅革命 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer
我们曾以为在电脑上运行手机应用必须忍受缓慢的模拟器&…
📅 2026/7/29 14:36:50
3分钟掌握免费开源视频下载助手:浏览器扩展完全指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper
你是否经常遇到这样的情况&am…
📅 2026/7/29 14:36:50
1. AI论文写作辅助工具的价值与现状作为一名在学术领域深耕多年的研究者,我深刻理解论文写作过程中的痛点。从文献综述到实验设计,从数据分析到论文撰写,每个环节都需要耗费大量时间精力。近年来AI技术的快速发展为学术写作带来了革命性变化&…
📅 2026/7/30 4:01:42
这是一款免费开源的屏幕自动滑动工具,专为测试与内容浏览场景设计。
摘要:本文介绍一款免费开源的安卓屏幕自动滑动工具,通过模拟手指滑动实现自动化操作,无需 root 权限。其核心优势包括完全免费、无广告、支持上下左右四向滑动…
📅 2026/7/30 4:01:42
在工业自动化领域,上位机作为人机交互与数据监控的核心枢纽,其稳定性与可靠性直接关乎生产安全与效率。然而,传统上位机开发常饱受内存泄漏、空指针异常、多线程数据竞争等顽疾困扰,尤其在724小时不间断运行的严苛环境下ÿ…
📅 2026/7/30 4:01:42
1. 项目概述:当AI开始帮你做PPT最近两年,AI工具井喷,从写代码到画图,现在终于轮到我们最熟悉的办公场景了。做PPT,这个让无数职场人、学生党、创业者又爱又恨的“体力活”,终于迎来了解放生产力的曙光。我作…
📅 2026/7/30 4:01:42
1. 项目概述:一场信息战与策略博弈又到了一年保研季,看着学弟学妹们四处打听消息、焦虑不安的样子,仿佛看到了几年前的自己。我当年参加了南开大学、西安交通大学计算机学院、中国科学技术大学先进技术研究院、天津大学、东南大学、电子科技大…
📅 2026/7/30 4:01:42
1. OpenClaw项目概述:从技术极客到大众工具的进化OpenClaw(小龙虾)这个项目最初在开发者社区引发17万人围观时,还只是一个需要复杂命令行操作的技术Demo。经过三个月的迭代,开发团队终于发布了"傻瓜版"解决方…
📅 2026/7/30 4:00:42
本文关键词:geo2是共价化合物哎,说实话,每次看到化学题里那些弯弯绕绕的电子式,我就头大。特别是遇到那种非要让你判断是离子还是共价的,心里就发毛。今天咱不整那些虚头巴脑的定义,就聊聊二氧化硅,也就是大家常说的硅石、石英,很多人会误写成geo2,虽然化学式不对,但…
📅 2026/7/30 0:00:24
B4557 [GESP202606 四级] 扫雷 https://www.luogu.com.cn/problem/B4557 中国计算机学会(CCF)2026年6月C四级讲解——扫雷 https://www.bilibili.com/video/BV1MCMg6AEXR/ B4557 [GESP202606 四级] 扫雷 https://www.bilibili.com/video/BV1ZKTj6ZEVh/ 2…
📅 2026/7/30 0:00:26
Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer
您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…
📅 2026/7/30 0:00:26
更多请点击:
https://codechina.net
第一章:AI帮助理解数学概念 人工智能正以前所未有的方式重塑数学学习的路径。通过自然语言处理与符号计算的深度融合,AI不仅能解析抽象定义,还能将定理、证明和几何直觉转化为可交互、可验证的…
📅 2026/7/30 1:16:07
1. 项目背景与核心价值去年参与的一个短剧项目让我深刻体会到传统创作流程的痛点:编剧团队花了三周打磨剧本,角色设计反复修改了七版,最后成片时又因为演员档期问题不得不临时调整分镜。这种低效的创作模式在快节奏的内容行业越来越难以为继。…
📅 2026/7/30 1:16:07
remix-i18next TypeScript类型安全实践:确保翻译键与类型定义同步 【免费下载链接】remix-i18next The easiest way to translate your React Router framework mode apps 项目地址: https://gitcode.com/gh_mirrors/re/remix-i18next
在开发多语言应用时&am…
📅 2026/7/30 1:16:07
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/29 7:15:11
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/29 17:15:46
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/29 5:15:05