当前位置: 首页 > news >正文

MySQL中ROW_NUMBER() OVER的用法以及使用场景

使用语法

ROW_NUMBER() OVER ([PARTITION BY partition_column1, partition_column2, ...]ORDER BY sort_column1 [ASC|DESC], sort_column2 [ASC|DESC], ...
)
  • PARTITION BY:将数据按指定列分组,每组内单独生成行号。
  • ORDER BY:决定组内行号的排序依据。

适用场景

1. 分页查询

在需要对结果集分页且需要全局排序时,ROW_NUMBER() 可替代传统 LIMIT/OFFSET,尤其在复杂排序或嵌套查询中更高效。

SELECT *
FROM (SELECT ROW_NUMBER() OVER (ORDER BY create_time DESC) AS row_num,id, title, create_timeFROM articles
) AS tmp
WHERE row_num BETWEEN 11 AND 20; -- 获取第2页(每页10条)

2. 去重(保留每组最新/第一条记录)

当数据有重复时,按业务逻辑保留每组中的特定行(如最新记录)。

WITH ranked_data AS (SELECT id, user_id, order_date,ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY order_date DESC) AS rnFROM orders
)
SELECT id, user_id, order_date
FROM ranked_data
WHERE rn = 1; -- 每个用户最近的一笔订单

3. 生成唯一排名(无并列排名)

即使值相同,ROW_NUMBER() 也会生成唯一序号(区别于 RANK() 和 DENSE_RANK())。

SELECT student_id, exam_score,ROW_NUMBER() OVER (ORDER BY exam_score DESC) AS rank
FROM exam_results; -- 分数相同的学生会得到不同排名

4. 分组分析(如时间序列处理)

按分区跟踪行号,用于分析组内趋势(如计算用户行为序列

SELECT user_id, event_time, event_type,ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY event_time) AS action_seq
FROM user_events; -- 标记用户行为的顺序

注意事项:

去重替代方案:若仅需去重,可考虑 DISTINCTGROUP BY,但复杂逻辑仍需 ROW_NUMBER()。

http://www.xdnf.cn/news/239671.html

相关文章:

  • 【Java函数式编程-58.1】深入理解Java中的Consumer函数式接口
  • 冠军之选,智启未来——解码威码逊的品牌传奇与冠军代言故事
  • 客户联络中心如何进行能力建设?
  • 【SAM2代码解析】数据集处理3--混合数据加载器(DataLoader)
  • 中国县级2m精度耕地分布数据(2020年)
  • 深度学习概述
  • Silo 科学数据工具库安装与使用指南
  • 【closerAI ComfyUI】开源社区炸锅!comfyUI原生支持Step1X-Edit 图像编辑!离简单免费高效又进一步
  • 关键词排名工具查到的位置和真实搜索差距大是什么原因?
  • SpringBoot优雅关机
  • MicroPython 开发ESP32应用教程 之 ADC及应用实例:电池电量检测并显示
  • HarmonyOS NEXT应用开发-Notification Kit(用户通知服务)notificationManager.cancelAll
  • ComfyUI
  • 国标GB28181平台EasyGBS未来研发方向在哪?
  • 数字中国开新篇,数智化为何需要新引擎
  • SLAM中的状态估计理论:从基础到前沿的完整解析
  • C++初阶:类和对象(二)
  • 机器学习|通过线性回归了解算法流程
  • spring 面试题
  • 智能 + 安全:婴幼儿托育管理实训基地标准化建设方案
  • 【LLM】MOE混合专家大模型综述(重要模块原理)
  • AI中常用概念的理解
  • w313安康学院新型冠状病毒肺炎疫情防控专题网站设计与实现
  • 【python实用小脚本-43】用Python自动发送生日祝福,让情感更高效
  • 架构进阶:72页集管IT基础设施蓝图设计方案【附全文阅读】
  • Nautilus侧栏没有桌面
  • 通过Yoast设置SEO标题不生效
  • OpenCV学习笔记(完)
  • Linux -- 操作系统
  • dubbo泛化调用时transient字段失效问题