sql语句查询成绩表各科前三名

--语法形式:    ROW_NUMBER() OVER(PARTITION BY COL1 ORDER BY COL2)
--解释:       根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)
--常用的使用场景: 取每个学科的前3名
--1.创建测试表
create table #score
(
name varchar(20),
subject varchar(20),
score int
) 

--2.插入测试数据
insert into #score(name,subject,score) values(‘张三‘,‘语文‘,98)
insert into #score(name,subject,score) values(‘张三‘,‘数学‘,80)
insert into #score(name,subject,score) values(‘张三‘,‘英语‘,90)
insert into #score(name,subject,score) values(‘李四‘,‘语文‘,88)
insert into #score(name,subject,score) values(‘李四‘,‘数学‘,86)
insert into #score(name,subject,score) values(‘李四‘,‘英语‘,88)
insert into #score(name,subject,score) values(‘李明‘,‘语文‘,60)
insert into #score(name,subject,score) values(‘李明‘,‘数学‘,86)
insert into #score(name,subject,score) values(‘李明‘,‘英语‘,88)
insert into #score(name,subject,score) values(‘林风‘,‘语文‘,74)
insert into #score(name,subject,score) values(‘林风‘,‘数学‘,99)
insert into #score(name,subject,score) values(‘林风‘,‘英语‘,59)
insert into #score(name,subject,score) values(‘严明‘,‘英语‘,96) 

--3.取每个学科的前3名数据
select * from
(
select subject,name,score,ROW_NUMBER() over(PARTITION by subject order by score desc) as num from #score
) T where T.num <= 3 order by subject 

--4.删除临时表 drop table #score  

结果:

原文地址:https://www.cnblogs.com/shengguorui/p/11198772.html

时间: 2024-10-10 19:58:05

sql语句查询成绩表各科前三名的相关文章

sql语句查询同一表内多字段同时重复的记录 sql数据库重复记录删除

分享下用sql语句删除数据库中重复记录的方法.比如现在有一人员表 (表名:peosons) 若想将姓名.身份证号.住址这三个字段完全相同的记录查询出来select p1.* from persons p1,persons p2 where p1.id<>p2.id and p1.cardid = p2.cardid and p1.pname = p2.pname and p1.address = p2.address可以实现上述效果.几个删除重复记录的SQL语句 1.用rowid方法2.用gr

关于oracle sql语句查询时表名和字段名要加双引号的问题

oracle初学者一般会遇到这个问题. 用navicat可视化创建了表,可是就是不能查到! 后来发现②语句可以查询到 ①select * from user; 但是,我们如果给user加上双引号就可以查到了! ②select * from "user"; 难道oracle跟mysql等不同,查询时候一定要加双引号?那这样不是很麻烦!于是经过查找资料得出如下结论: 1.oracle表和字段是有大小写的区别.oracle默认是大写,如果我们用双引号括起来的就区分大小写,如果没有,系统会自动

sql语句查询数据库表结构信息

开发中经常用到查询指定表及其字段的信息,以下是我整理的SQL语句查询方法,供自己平时使用也提供给大家参考! 1.适用MS SQL SERVER: 1 SELECT 2 表名 = case when a.colorder=1 then d.name else '' end, 3 表说明 = case when a.colorder=1 then isnull(f.value,'') else '' end, 4 字段序号 = a.colorder, 5 字段名 = a.name, 6 标识 = c

关于oracle sql语句查询时 表名和字段名要加双引號的问题具体解释

  作为oracle的刚開始学习的人相信大家一定会遇到这个问题.如图:          明明就是navicat可视化创建了表,但是就是不能查到!这个为什么呢?           select * from user;           可是,我们假设给user加上双引號就不一样了!   select * from "user"; 却能够等到以下的结果.如图:          到这里我想大家肯定会说:难道oracle跟mysql等不同,查询时候一定要加双引號?那这样不是非常麻烦!

一条SQL语句查询两表中两个字段

首先描述问题,student表中有字段startID,endID.garde表中的ID需要对应student表中的startID或者student表中的endID才能查出grade表中的name字段,这时候问题就来了,如果需要一条sql一句同时查出garde表中的两条数据怎么办?(两表的关联字段为 SID) sql="select b.name,c.name as name2 from student a,garde b,grade c where a.SID=b.SID and a.SID=c

使用SQL语句查询每张表的column name

exec sp_columns tableName 上面这行代码可以查出该表所有的column,改为sp_pkeys,可以查出该表的主键.但是我如果想只查出column name,select COLUMN_NAME FROM(exec sp_columns tableName) as A,这样写是不行的,必须要create一张表,把数据insert进去. 还有另外一种方法可直接查询: select name from syscolumns where OBJECT_name(id)='tabl

sql语句查询一个表中某一列的相同数据

1.找出这列中有相同内容的列的数据.代码如下: select 列名 from 表名 group by 列名 having count(列名) > 1 2.把这些有相同内容的记录,查出来.代码如下: select 列名 from 表名 where 列名 in (select 列名 from 表名 group by 列名 having count(列名) > 1)

SQL语句对于多表联合查询重复字段的特殊语法处理

SQL语句对于多表联合查询重复字段的特殊语法处理 原创 2016年01月13日 14:22:36 5309 [sql] view plain copy SELECT m.*,d_name,r_name,m2.m_account as shangji_account FROM Member m,Member m2,Role r,Depart d WHERE m.m_rid=r.id and m.m_did=d.id and m.m_shangji=m2.id ORDER BY m.id DESC

Orancle的SQL语句的多表查询和组函数

Orancle的SQL语句的多表查询和组函数一.SQL的多表查询:1.左连接和右连接(不重要一方加(+))SELECT e.empno,e.ename,d.deptno,d.dname,d.loc FROM emp e,dept d WHERE e.deptno(+)=d.deptno ;(+)在等号左边是右连接,反之左连接.2.交叉连接 (CROSS JOIN产生笛卡尔积)SELECT FROM emp CROSS JOIN dept ;3.自然连接 (NATURAL JOIN)自动关联字段匹