sql实现TOPN

转载鑫语大数据的  微信存不了收藏夹  复制过来的  侵权立删

CREATE TABLE `test1` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `name` varchar(20) DEFAULT NULL,

  `course` varchar(20) DEFAULT NULL,

  `score` int(11) DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

insert into test1(name,course,score)

values

('张三','语文',80),

('李四','语文',90),

('王五','语文',93),

('张三','数学',77),

('李四','数学',68),

('王五','数学',99),

('张三','英语',90),

('李四','英语',50),

('王五','英语',89);

select * from test1;

Top 1

查询每门课程分数最高的学生以及成绩

1、使用自连接【推荐】

select a.name,a.course,a.score from test1 a

join (select course,max(score) score from test1 group by course) b

on a.course=b.course and a.score=b.score;

2、使用相关子查询

select `name`,course,score from test1 a

where score=(select max(score) from test1 where a.course=test1.course);

select `name`,course,score from test1 a

where not exists

(select 1 from test1 where a.course=test1.course and a.score < test1.score);

Top N

N>=1

查询每门课程前两名的学生以及成绩

1、使用union all

如果结果集比较小,可以用程序查询单个分组结果后拼凑,也可以使用union all

(select name,course,score from test1 where course='语文' order by score desc limit 2) union all

(select name,course,score from test1 where course='数学' order by score desc limit 2) union all

(select name,course,score from test1 where course='英语' order by score desc limit 2);

2、自身左连接

select a.name,a.course,a.score

from test1 a left join test1 b on a.course=b.course and a.score<b.score

group by a.name,a.course,a.score

having count(b.id)<2

order by a.course,a.score desc;

3、相关子查询

select * from test1 a

where 2>(select count(*) from test1 where course=a.course and score>a.score)

order by a.course,a.score desc;

4、使用用户变量

set @num := 0, @course := '';

select name, course, score

from (

select name, course, score,

@num := if(@course = course, @num + 1, 1) as row_number,

@course := course as dummy

from test1 order by course, score desc) as x

where x.row_number <= 2;

备注:

如果是oracel

SELECT * FROM (SELECT ROW_NUMBER() OVER(PARTITION BY x ORDER BY y DESC)

rn,test1.* FROM test1)        

WHERE rn = 1 ;

猜你喜欢

转载自www.cnblogs.com/lkoooox/p/11756526.html