Oracle over(partition by) 用法

发布时间 2023-09-12 10:01:15作者: 疯狂马铃薯

语法与说明

select AAA, 序号函数 over(partition by BBB group by CCC) from table;
  1. select后面跟什么字段随便。
  2. 序号函数有多种,类似row_number()等。
  3. partition by后面跟的字段实际是分组字段,与group by 后面跟的字段类似。
  4. 再之后的order字段,就是分组后排序。

序号函数说明

测试数据

CREATE TABLE over_func_tmp(
name varchar(10),
age  number(1)
);

INSERT INTO over_func_tmp(name,age) 
SELECT 'a', 1 FROM dual UNION ALL  
SELECT 'a', 1 FROM dual UNION ALL  
SELECT 'a', 2 FROM dual UNION ALL  
SELECT 'a', 4 FROM dual
;

row_number()

直接按照结果从1开始升序。

SELECT t.name, t.age , ROW_NUMBER() over(PARTITION BY name ORDER BY age) AS no FROM over_func_tmp t;
--a	1	1
--a	1	2
--a	2	3
--a	4	4

rank()

如果结果中,某数据相同,则序号相同,下一行数据序号+2。

SELECT t.name, t.age , rank() over(PARTITION BY name ORDER BY age) AS no FROM over_func_tmp t;
--a	1	1
--a	1	1
--a	2	3
--a	4	4

dense_rank()

如果结果中,某数据相同,则序号相同,下一行数据序号+1。

SELECT t.name, t.age , dense_rank() over(PARTITION BY name ORDER BY age) AS no FROM over_func_tmp t;
--a	1	1
--a	1	1
--a	2	2
--a	4	3