ROW_NUMBER()函數將針對SELECT語句返回的每一行,從1開始編號,賦予其連續的編號。在查詢時應用了一個排序標准后,只有通過編號才能夠保證其順序是一致的,當使用ROW_NUMBER函數時,也需要專門一列用於預先排序以便於進行編號。
ROW_NUMBER()
說明:返回結果集分區內行的序列號,每個分區的第一行從1開始。
語法:ROW_NUMBER () OVER ([ <partition_by_clause> ] <order_by_clause>) 。
備注:ORDER BY 子句可確定在特定分區中為行分配唯一 ROW_NUMBER 的順序。
參數:<partition_by_clause> :將 FROM 子句生成的結果集划入應用了 ROW_NUMBER 函數的分區。
<order_by_clause>:確定將 ROW_NUMBER 值分配給分區中的行的順序。
返回類型:bigint 。
======================================================================
此次實現的是Finereport中根據學生各科成績進行各科成績的排名

准備數據:
create table grade --班級表
(
gno INT, --編號
gradeName VARCHAR(100) --班級名稱
)
go
insert into grade values(1901,'Z-19001'),
(1902,'Z-19002'),
(1903,'Z-19003')
go
create table course --課程表
(
cno INT,--課程編號
cname VARCHAR(100), --課程名稱
tno INT --教師編號
)
go
insert into course values(1,'微積分',804),
(2,'計算機導論',801),
(3,'計算機編程',802),
(4,'python爬蟲',803),
(5,'HTML5',805)
go
create table student --學生表
(
sno INT, --學生編號
sname VARCHAR(100),--學生姓名
ssex VARCHAR(100),--學生性別
sbirthday VARCHAR(100),--學生生日
gno INT --班級編號
)
go
insert into student values(1001,'張三','男','1998-12-11',1901),
(1002,'張山','男','1999-11-11',1901),
(1003,'張三豐','男','1978-09-19',1901),
(1004,'lily','女','1988-11-01',1902),
(1005,'candy','女','1989-03-12',1902),
(1006,'Tom','男','1992-05-28',1902),
(1007,'Jack','男','1994-04-13',1903),
(1008,'mark','男','1996-06-06',1903),
(1009,'shary','女','1997-06-08',1903)
go
create table score --分數表
(
sno INT, --學生編號
cno INT, --課程編號
degree decimal(10,2) --分數
)
go
insert into score values(1001,1,'92'),
(1001,2,'95.5'),
(1001,3,'89.5'),
(1002,2,'92'),
(1002,3,'65.5'),
(1002,5,'92.2'),
(1003,3,'88'),
(1003,4,'66'),
(1003,5,'76'),
(1004,1,'93'),
(1004,2,'96'),
(1004,5,'78')
go
執行組內排序:
SELECT s.sname,s.sno,g.gradeName,c.cname,o.degree,row_number() over(partition by cname order by degree desc) as 排名 FROM student s inner join dbo.grade g on s.gno=g.gno inner join dbo.score o on o.sno=s.sno inner join dbo.course c on c.cno=o.cno
※※ over(partition by cname order by degree desc) 按照degree排序進行累計,order by是個默認的開窗函數,按照cname分區
查詢結果:

報表展示結果:

