【SQL】Oracle开窗函数ROW_NUMBER() OVER() 和 分析函数PARTITION BY


mysql不适用!!!

一、ROW_NUMBER OVER

  1. 语法格式:row_number() over(partition by 分组列 order by 排序列 desc)
  2. 注意:row_number() over()函数时候,over()里的分组以及排序的执行晚于 where 、group by、 order by 的执行。
  3. 查询案例:
// 表
CREATE TABLE `User` (
  `name` varchar(100) DEFAULT NULL,
  `course` varchar(100) DEFAULT NULL,
  `score` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

// 数据
INSERT INTO local_database.`User`
(name, course, score)
VALUES('wangwu', 'English', 60);
INSERT INTO local_database.`User`
(name, course, score)
VALUES('wangwu', 'Chinese', 50);
INSERT INTO local_database.`User`
(name, course, score)
VALUES('wangwu', 'Math', 55);

// 查询 ---  按照course分组
SELECT *, ROW_NUMBER() OVER(PARTITION BY u.course ORDER BY u.score) num FROM `User` u
// 查询结果
Id Name Course Score 排名
1002 张三 数学		 90	 	1
1004 李四 数学		 60		 2
1007 王五 数学 		30 		3
1001 李四 英语 		100		 1
1008 张三 英语 		60 		2
1003 王五 英语		 50		 3
1000 张三 语文		 80		 1
1005 李四 语文 		80		 2
1006 王五 语文 		50 		3

二、PARTITION BY 和 GROUP BY 区别

  1. 区别:
    partition by(分析性函数) 在于返回的是分组里的每一条数据,并且可以对分组数据进行排序操作;
    group by(聚合函数)只能返回聚合之后的组的数据统计值的记录。

  2. 测试:

// 查询 ---  按照name分组
SELECT *, ROW_NUMBER() OVER(PARTITION BY u.name ORDER BY u.score) num FROM `User` u
// 查询结果
Id Name Course Score num
1004 李四 数学		 60		1
1005 李四 语文 		80		2
1001 李四 英语 		100 	3
1007 王五 数学		 30 		1
1006 王五 语文 		50		 2
1003 王五 英语		 50 		3
1008 张三 英语	 	60 		1
1000 张三 语文		 80 		2
1002 张三 数学 		90 		3


// 查询 ---  按照course分组
SELECT *, ROW_NUMBER() OVER(PARTITION BY u.course ORDER BY u.score) num FROM `User` u
// 查询结果
Id Name Course Score 排名
1002 张三 数学		 90	 	1
1004 李四 数学		 60		 2
1007 王五 数学 		30 		3
1001 李四 英语 		100		 1
1008 张三 英语 		60 		2
1003 王五 英语		 50		 3
1000 张三 语文		 80		 1
1005 李四 语文 		80		 2
1006 王五 语文 		50 		3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鱼小鱼啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值