当前位置: 首页 > 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.dtcms.com/a/166319.html

相关文章:

  • CentOS网络之network和NetworkManager深度解析
  • windows系统常用快捷键(CMD常用命令,DOS常用命令)
  • PostgreSQL数据库操作基本命令
  • windows 下 oracle 数据库的备份与还原
  • 多线程系列一:认识线程
  • 【计算机网络】​TCP(传输控制协议)套接字,多线程远程执行命令编程​
  • 2025年真实面试问题汇总(一)
  • 【Python学习路线】零基础到项目实战
  • RFID光触发标签工业级分拣难题的深度解决方案
  • Vue3笔记摘录
  • 读论文笔记-CoOp:对CLIP的handcrafted改进
  • 兰亭妙微:全流程交互设计和设计前后对比
  • 如何加速机器学习模型训练:深入探讨与实用技巧
  • Vue2 vs Vue2.7 深度对比
  • 【Java】打印运行环境中某个类引用的jar版本路径
  • Nginx核心
  • 深入探索ChatClient:简化AI模型交互的强大工具
  • Compose笔记(二十一)--AnimationVisibility
  • 深度学习论文: Describe Anything: Detailed Localized Image and Video Captioning
  • 柔性生产是什么?怎样能实现柔性生产?
  • PC端实现微信扫码登录
  • 图数据库榜单网站
  • Doris索引机制全解析,如何用高效索引加速数据分析
  • ESP32开发-作为TCP服务端接收数据
  • Oracle Bigfile 与 Smallfile 表空间对比分析
  • 如何在Windows上实现MacOS中的open命令
  • 第 11 届蓝桥杯 C++ 青少组中 / 高级组省赛 2020 年真题答和案解析
  • 【机器学习】使用VGG16与K-Means对大量图片进行自动分类
  • 海思3559a_怎么开启SHUB_UART1功能
  • kbuild system学习