标签:
语法: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
标签:
原文地址:http://www.cnblogs.com/hbwy/p/4914155.html