语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)
PARTITION BY:相当于数据库中的group by
说明:row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值表示每组排序后的顺序编号(从1开始,组内连续的唯一的编号)
--新建表Table_A
create table Table_A(name varchar(8),Subject varchar(8),Grade int)
insert into Table_A values('小A','数学',90)
insert into Table_A values('小A','语文',79)
insert into Table_A values('小A','英语',88)
insert into Table_A values('小B','数学',99)
insert into Table_A values('小B','语文',76)
insert into Table_A values('小B','英语',82)
insert into Table_A values('小C','数学',78)
insert into Table_A values('小C','语文',67)
insert into Table_A values('小C','英语',81)
insert into Table_A values('小D','数学',93)
insert into Table_A values('小D','语文',75)
insert into Table_A values('小D','英语',84)
--原始表
select * from Table_A
name | Subject | Grade |
小A | 数学 | 90 |
小A | 语文 | 79 |
小A | 英语 | 88 |
小B | 数学 | 99 |
小B | 语文 | 76 |
小B | 英语 | 82 |
小C | 数学 | 78 |
小C | 语文 | 67 |
小C | 英语 | 81 |
小D | 数学 | 93 |
小D | 语文 | 75 |
小D | 英语 | 84 |
--执行以下语句后
select ROW_NUMBER() OVER(PARTITION BY name order by Grade desc) as id,name,Subject,Grade from Table_A
id | name | Subject | Grade |
1 | 小A | 数学 | 90 |
2 | 小A | 英语 | 88 |
3 | 小A | 语文 | 79 |
1 | 小B | 数学 | 99 |
2 | 小B | 英语 | 82 |
3 | 小B | 语文 | 76 |
1 | 小C | 英语 | 81 |
2 | 小C | 数学 | 78 |
3 | 小C | 语文 | 67 |
1 | 小D | 数学 | 93 |
2 | 小D | 英语 | 84 |
3 | 小D | 语文 | 75 |
--根据字段name分组,Grade排序
--提取成绩中的最大值,可用以下语句
select * from
(
select ROW_NUMBER() OVER(PARTITION BY name order by Grade desc) as id,name,Subject,Grade from Table_A
)TT where id = 1
--每名学生,只显示前2单成绩,修改代码为以下即可
select * from
(
select ROW_NUMBER() OVER(PARTITION BY name order by Grade desc) as id,name,Subject,Grade from Table_A
)TT where id between 1 and 2