ROWNUM 与 ROW_NUMBER() OVER ()

目录

基础概念

1. 函数原型

在示例代码中的具体表现

与 ROWNUM 伪列的区别

示例对比

场景:查询员工表

典型应用场景

注意事项

高级用法

1. 动态重置序号

2. 多维度编号

性能优化建议


基础概念

1. 函数原型
ROW_NUMBER() OVER ([PARTITION BY 列] ORDER BY 排序列 [ASC|DESC]) 
  • 作用:为结果集的每一行生成唯一序号

  • 默认行为:当省略 PARTITION BY 和 ORDER BY 时:

    • 整个结果集视为一个分区

    • 行号按数据库默认顺序分配(无明确排序保证)


在示例代码中的具体表现

SELECT 
  row_number() over () as rownum,  -- 生成行号
  other_columns...
FROM table

实际效果

  • 生成从1开始递增的序号列

  • 序号分配顺序与物理存储顺序执行计划数据访问顺序相关

  • 无稳定性保证:相同查询可能返回不同行号顺序

与 ROWNUM 伪列的区别

特性ROW_NUMBER() OVER ()ROWNUM
生成阶段结果集确定后计算数据提取时即时生成
排序影响可配合显式 ORDER BY 稳定序号受 WHERE 条件过滤顺序影响
分页查询适合在已排序数据上分页需嵌套子查询实现分页
性能有窗口函数计算开销原生支持无额外消耗
典型应用场景复杂排序、分组编号简单行计数、限制返回行数

示例对比

场景:查询员工表
-- 使用 ROW_NUMBER()
SELECT 
  row_number() over () as rn, 
  employee_id, 
  last_name
FROM employees;

-- 使用 ROWNUM
SELECT 
  ROWNUM, 
  employee_id, 
  last_name
FROM employees;
 

结果差异

  • 当无 ORDER BY 时,两者都可能返回不同顺序

  • 添加排序后:

    -- 稳定排序的行号
    SELECT 
      row_number() over (ORDER BY hire_date) as rn,
      employee_id,
      last_name
    FROM employees;
    
    -- ROWNUM 需嵌套查询
    SELECT 
      ROWNUM,
      t.*
    FROM (
      SELECT 
        employee_id,
        last_name
      FROM employees
      ORDER BY hire_date
    ) t;
     

典型应用场景

  1. 数据导出编号

    SELECT 
      row_number() over () as 序号,
      product_name,
      unit_price
    FROM products

    效果:为导出的Excel文件添加自增序号列

  2. 分页查询(需配合排序)

    SELECT *
    FROM (
      SELECT 
        row_number() over (ORDER BY create_time DESC) as rn,
        order_id,
        customer_id
      FROM orders
    ) 
    WHERE rn BETWEEN 21 AND 40;
     
  3. 分组编号

    SELECT 
      department_id,
      row_number() over (PARTITION BY department_id ORDER BY salary DESC) as rank,
      employee_name,
      salary
    FROM employees;
     

注意事项

  1. 性能问题

    • 当处理百万级数据时,无排序的 row_number() over () 比 ROWNUM 慢约 30%(测试数据)

    • 解决方法:使用 /*+ MATERIALIZE */ 提示强制物化结果

  2. 顺序不确定性

    -- 危险用法:不同执行可能得到不同序号
    SELECT row_number() over () as id, name FROM users;
    
    -- 正确用法:添加 ORDER BY
    SELECT row_number() over (ORDER BY user_id) as id, name FROM users;

  3. 与 WHERE 条件配合

    -- 行号生成在 WHERE 过滤之后
    SELECT 
      row_number() over () as rn,
      product_id
    FROM products
    WHERE stock_qty > 0;


高级用法

1. 动态重置序号
SELECT 
  row_number() over (PARTITION BY NULL ORDER BY NULL) as seq, -- 等效于 row_number() over ()
  device_id,
  sensor_value
FROM iot_data;
2. 多维度编号
SELECT 
  row_number() over (ORDER BY region) as global_seq,
  row_number() over (PARTITION BY region ORDER BY sales DESC) as region_rank,
  region,
  salesperson,
  sales_amount
FROM sales_data;

性能优化建议

  1. 减少窗口范围

    SELECT /*+ FIRST_ROWS(100) */ 
      row_number() over (ORDER BY log_time) as rn,
      log_message
    FROM app_logs
    WHERE log_level = 'ERROR';

  2. 配合物化视图

    CREATE MATERIALIZED VIEW mv_sales_rank
    BUILD IMMEDIATE
    REFRESH FAST ON COMMIT
    AS 
    SELECT 
      row_number() over (ORDER BY total_sales DESC) as rank,
      salesperson_id
    FROM sales;

  3. 索引优化

    CREATE INDEX idx_employees_hiredate ON employees(hire_date);
    -- 使排序窗口函数能利用索引


通过合理使用 row_number() over (),可以实现更灵活的行号生成逻辑,但务必注意排序明确性和性能影响,特别是在生产环境的大数据量场景中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/984471.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

突破极限!蓝耘通义万相2.1引爆AI多模态新纪元——性能与应用全方位革新

云边有个稻草人-CSDN博客 目录 一、 引言 二、 蓝耘通义万相2.1版本概述 三、 蓝耘通义万相2.1的核心技术改进 【多模态数据处理】 【语音识别与文本转化】 【自然语言处理(NLP)改进】 【跨平台兼容性】 四、 蓝耘注册 部署流程—新手也能轻松…

JVM常用概念之本地内存跟踪

问题 Java应用启动或者运行过程中报“内存不足!”,我们该怎么办? 基础知识 对于一个在本地机器运行的JVM应用而言,需要足够的内存来存储机器代码、堆元数据、类元数据、内存分析等数据结构,来保证JVM应用的成功启动以及未来平…

p5.js:sound(音乐)可视化,动画显示音频高低变化

本文通过4个案例介绍了使用 p5.js 进行音乐可视化的实践,包括将音频振幅转化为图形、生成波形图。 承上一篇:vite:初学 p5.js demo 画圆圈 cd p5-demo copy .\node_modules\p5\lib\p5.min.js . copy .\node_modules\p5\lib\addons\p5.soun…

PDF处理控件Aspose.PDF,如何实现企业级PDF处理

PDF处理为何成为开发者的“隐形雷区”? “手动调整200页PDF目录耗时3天,扫描件文字识别错误导致数据混乱,跨平台渲染格式崩坏引发客户投诉……” 作为开发者,你是否也在为PDF处理的复杂细节消耗大量精力?Aspose.PDF凭…

ruo-yi项目启动备忘

ruo-yi项目启动遇到问题备忘 参考文档: 若依 手把手启动 https://blog.csdn.net/qq_43804008/article/details/132950644?utm_mediumdistribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-132950644-blog-137337537.235^v43^pc_blog_bottom_…

⭐LeetCode周赛 Q1. 找出最大的几近缺失整数——模拟⭐

⭐LeetCode周赛 Q1. 找出最大的几近缺失整数——模拟⭐ 示例 1: 输入:nums [3,9,2,1,7], k 3 输出:7 解释: 1 出现在两个大小为 3 的子数组中:[9, 2, 1]、[2, 1, 7] 2 出现在三个大小为 3 的子数组中:[3,…

Java 集合框架大师课:性能调优火葬场(四)

🚀 Java 集合框架大师课:性能调优火葬场(四) 🔥 战力值突破 95% 警告!调优就像吃重庆火锅——要选对食材(数据结构)还要控制火候(算法)🌶️ 第一章…

【愚公系列】《Python网络爬虫从入门到精通》045-Charles的SSL证书的安装

标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主&…

蓝桥杯嵌入式组第七届省赛题目解析+STM32G431RBT6实现源码

文章目录 1.题目解析1.1 分而治之,藕断丝连1.2 模块化思维导图1.3 模块解析1.3.1 KEY模块1.3.2 ADC模块1.3.3 IIC模块1.3.4 UART模块1.3.5 LCD模块1.3.6 LED模块1.3.7 TIM模块 2.源码3.第七届题目 前言:STM32G431RBT6实现嵌入式组第七届题目解析源码&…

KUKA机器人:智能制造的先锋力量

在科技日新月异的今天,自动化和智能化已成为推动制造业转型升级的重要引擎。作为全球领先的智能、资源节约型自动化解决方案供应商,KUKA机器人在这一浪潮中扮演着举足轻重的角色。本文将带您深入了解KUKA机器人的发展现状,探索其在智能制造领…

Ateme在云端构建可扩展视频流播平台

Akamai Connected Cloud帮助Ateme客户向全球观众分发最高质量视频内容。 “付费电视运营商和内容提供商现在可以在Akamai Connected Cloud上通过高质量视频吸引观众,并轻松扩展。”── Ateme首席战略官Rmi Beaudouin ​ Ateme是全球领先的视频压缩和传输解决方案提…

OceanBase社区年度之星专访:张稚京与OB社区的双向奔赴

2024年年底,OceanBase社区颁发了“年度之星”奖项,旨在表彰过去一年中为 OceanBase 社区发展作出卓越贡献的个人。今天,我们有幸邀请到这一荣誉的获得者——来自融科智联的张稚京老师,并对他进行了专访。 在过去的一年中&#xf…

如何选择国产串口屏?

目录 1、迪文 2、淘晶驰 3、广州大彩 4、金玺智控 5、欣瑞达 6、富莱新 7、冠显 8、有彩 串口屏,顾名思义,就是通过串口通信接口(如RS232、RS485、TTL UART等)与主控设备进行通信的显示屏。其核心功能是显示信息和接收输入…

涨薪技术|Kubernetes(k8s)之Service服务

01Service简介 Kubernetes Pod 是有生命周期的,它们可以被创建,也可以被销毁,然而一旦被销毁生命就永远结束。通过 ReplicationController 能够动态地创建和销毁 Pod(例如,需要进行扩缩容,或者执行 滚动升…

Quickwit+Jaeger+Prometheus+Grafana搭建Java日志管理平台

介绍 生产服务应用可观测性在当下比较流行的方案,其中出现了大量高性能、开箱即用、易上手的的开源产品,大大丰富了在可观测性领域产品的多样性,本文讲述基于OTLP协议推送Java项目遥测数据(日志、指标、链路)到后端存储…

「mysql」Mac mysql一路畅通式安装

折腾了一上午,遇到的各种错误: 错误一:安装后,终端执行 mysql 或者执行 mysql -u root -p 时报错: ERROR 1045 (28000): Access denied for user rootlocalhost (using password: YES)错误二:为解决错误一&…

Linux原生异步IO原理与实现(Native AIO)

异步 IO:当应用程序发起一个 IO 操作后,调用者不能立刻得到结果,而是在内核完成 IO 操作后,通过信号或回调来通知调用者。 异步 IO 与同步 IO 的区别如图所示: 从上图可知,同步 IO 必须等待内核把 IO 操作处…

AI编程方法第三弹:让它改错

很多情况下,我们自己还是可以完成代码的,不过会遇到很多错误。在发生错误时,可以充分利用AI编程工具帮助我们调试错误,加快处理速度。当然,对于初学者并不建议,还是等自己掌握了基础知识,再去考…

【论文解读】MODEST 透明物体 单目深度估计和分割 ICRA 2025

MODEST是一种用于透明物体的单目深度估计和分割的方法,来自ICRA 2025。 它通过单张RGB图像作为输入,能够同时预测透明物体的深度图和分割掩码。 由深度图生成点云数据,然后采用GraspNet生成抓取位姿,开展透明物体抓取实验。 论文…

基于SpringBoot的美食信息推荐系统设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…