row_number() over(partition by 分组列 order by 排序列 desc)
create table TEST_ROW_NUMBER_OVER(
id varchar(10) not null,
name varchar(10) null,
age varchar(10) null,
salary int null
);
select * from TEST_ROW_NUMBER_OVER t;
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(1,'a',10,8000);
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(1,'a2',11,6500);
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(2,'b',12,13000);
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(2,'b2',13,4500);
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(3,'c',14,3000);
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(3,'c2',15,20000);
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(4,'d',16,30000);
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(5,'d2',17,1800);
SELECT id,NAME,age,salary,row_number()over(ORDER BY salary DESC) rank
FROM TEST_ROW_NUMBER_OVER t
select id,name,age,salary,row_number()over(partition by id order by salary desc) rank
from TEST_ROW_NUMBER_OVER t
SELECT * FROM(SELECT id,NAME,age,salary,row_number()over(PARTITION BY id ORDER BY salary DESC) rank
FROM TEST_ROW_NUMBER_OVER ) t
WHERE rank <2
select id,name,age,salary,row_number()over(order by salary desc) rank
from TEST_ROW_NUMBER_OVER t where age between '13' and '16'
结果:结果中 rank 的序号,其实就表明了 over(order by salary desc) 是在where age between and 后执行的
/*-创建学生成绩表-*/
CREATE TABLE StuScore
(
StuID INT,
StuName VARCHAR(20),
ClassID INT,
SUBJECT VARCHAR(20),
Score INT
);
/*-创建班级信息表-*/
CREATE TABLE ClassInfo
(
ClassID INT,
ClassName VARCHAR(20)
);
/*-添加学生成绩信息-*/
INSERT INTO StuScore VALUES(1,'张三',1,'语文',60);
INSERT INTO StuScore VALUES(1,'张三',1,'数学',90);
INSERT INTO StuScore VALUES(1,'张三',1,'英语',70);
INSERT INTO StuScore VALUES(2,'李四',2,'语文',100);
INSERT INTO StuScore VALUES(2,'李四',2,'数学',90);
INSERT INTO StuScore VALUES(3,'王五',2,'语文',80);
/*-添加班级信息-*/
INSERT INTO ClassInfo VALUES(1,'高一(1)班');
INSERT INTO ClassInfo VALUES(2,'高二(3)班');
SELECT ROW_NUMBER() OVER(ORDER BY Score DESC) AS Row_Index,*
FROM StuScore
SELECT ROW_NUMBER() OVER(PARTITION BY StuID ORDER BY Score DESC) AS Row_Index,*
FROM StuScore
SELECT t.* FROM(
SELECT ROW_NUMBER() OVER(PARTITION BY StuID ORDER BY Score DESC) AS Row_Index,*
FROM StuScore
) t WHERE t.Row_Index = 1
SELECT t1.StuID,t1.StuName,t1.Subject,t1.Score,t2.ClassName FROM(
SELECT tt.* FROM(
SELECT ROW_NUMBER() OVER(PARTITION BY StuID ORDER BY Score DESC) AS Row_Index,*
FROM StuScore
) tt WHERE tt.Row_Index = 1) t1
LEFT JOIN ClassInfo t2 ON t1.ClassID = t2.ClassID
MySQL基础–10—MySQL8新特性----窗口函数