无名阁,只为技术而生。流水不争先,争的是滔滔不绝。

(oracle row_number) Oracle 中 row_number()、rank()、dense_rank() 函数的用法详解 Oracle数据库中的三个分析函数:ROW_NUMBER()RANK()和DENSE_RANK() 全网首发(图文详解1)

前沿技术 Micheal 6个月前 (06-19) 79次浏览 已收录 扫描二维码

(oracle row_number) Oracle 中 row_number()、rank()、dense_rank() 函数的用法详解

Oracle数据库中的ROW_NUMBER()RANK()DENSE_RANK()都是分析函数,用来进行数据的排序和排名。这些函数通常与OVER()子句搭配使用,来指定分析函数的分区和排序规则。

1. ROW_NUMBER()

ROW_NUMBER()函数为每个分组内的行提供一个唯一的序列号,从1开始,针对ORDER BY中指定的排序列,按照指定的顺序进行编号。

用法:

ROW_NUMBER() OVER (PARTITION BY column_name1, column_name2, ... ORDER BY column_name3, column_name4, ...)

示例:

SELECT employee_id, department_id, salary,
       ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS row_num
  FROM employees;

这个示例将按各部门对员工的薪资进行降序排列,每个部门的员工都会被分配一个独立的行号。

2. RANK()

RANK()函数在有相同值的情况下会给出相同的排名,并且排名不连续。如果有并列的情况,下一个排名会跳过并列数量。

用法:

RANK() OVER (PARTITION BY column_name1, column_name2, ... ORDER BY column_name3, column_name4, ...)

示例:

SELECT employee_id, department_id, salary,
       RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rank
  FROM employees;

如果有两个员工薪资并列第一,那么这两个员工的rank都是1,下一个员工的rank就是3。

3. DENSE_RANK()

DENSE_RANK()函数的用法与RANK()类似,不同点在于DENSE_RANK()在有相同值的情况下仍然会给出相同的排名,但排名是连续的。

用法:

DENSE_RANK() OVER (PARTITION BY column_name1, column_name2, ... ORDER BY column_name3, column_name4, ...)

示例:

SELECT employee_id, department_id, salary,
       DENSE_RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS dense_rank
  FROM employees;

即便存在并列,比如两个员工薪资并列第一,他们的dense_rank是1,下一个员工的dense_rank则是2。

在实际使用这些函数时,请确保您的Oracle数据库支持这些功能,并且注意函数的具体语法可能根据不同版本的Oracle略有不同。这里提供的示例可以作为基本的参考和起点。
(stream anymatch) Java8新特性Stream流中anyMatch和allMatch和noneMatch的区别解析 Java 8引入的Stream API三个核心方法 全网首发(图文详解1)
(vue :is) vue动态组件之:is在组件中的使用场景 Vue 的动态组件 全网首发(图文详解1)

喜欢 (0)
[]
分享 (0)
关于作者:
流水不争先,争的是滔滔不绝