经常会有查询数据库最大的记录或者前N条记录,根据某个字段分组。自己整理如下。
数据如下:
id kc xh score
------ ------ ------ --------
1 语文 0023 70
2 语文 0024 76
3 语文 0025 68
4 数学 0023 15
5 数学 0024 68
6 数学 0025 95
7 数学 0026 73
8 英语 0023 77
9 英语 0024 69
10 英语 0025 12
11 英语 0026 54
12 语文 0026 34
13 物理 0023 99
14 化学 0023 89
1、 要求查询分数最大的几个方法。结果如下:
id kc xh score
------ ------ ------ --------
2 语文 0024 76
6 数学 0025 95
8 英语 0023 77
13 物理 0023 99
14 化学 0023 89
一、排除法
SELECT * FROM s_score a WHERE NOT EXISTS (SELECT 1 FROM s_score b WHERE a.kc=b.kc AND a.score<b.score);
这个是用到exists,也是最容易想到的。
二、内连接分组法
SELECT a.* FROM s_score a INNER JOIN (SELECT MAX(score) score,kc FROM s_score GROUP BY kc) b ON a.kc=b.kc AND a.score=b.score;
这个则是先查询出每科最多的分数,然后内连接关联找出
三、临时表分组法
SELECT * FROM (SELECT * FROM s_score ORDER BY score DESC ) t GROUP BY kc;
这个也很简单,先排序,再分组。
2、要求分数在前2名的学科和学号,结果如下
id kc xh score
------ ------ ------ --------
14 化学 0023 89
6 数学 0025 95
7 数学 0026 73
13 物理 0023 99
8 英语 0023 77
9 英语 0024 69
2 语文 0024 76
1 语文 0023 70
一、左连接having排除法
SELECT a.* FROM s_score a LEFT JOIN s_score b ON a.kc=b.kc AND a.score<b.score GROUP BY a.id,a.kc,a.xh,a.score HAVING COUNT(b.id)<2 ORDER BY a.kc,a.score DESC;
这个要先理解,理解了还是挺容易的。a会跟b的每一条比较,找处a分数小于b的,那只有第二名的分数小于第一名,然后第一名是不会小于b表中任何记录的。但是是左连接,所以结果就是前两面的记录了。
二、count排除法
SELECT * FROM s_score a WHERE 2>(SELECT COUNT(*) FROM s_score b WHERE a.kc=b.kc AND a.score<b.score) ORDER BY a.kc,a.score DESC;
这个原因和上面的差不多。count小于2,会有0和1,为0的情况是a中最多的分数,为1是a中第二大,b中分数最大。
参考一下:http://blog.csdn.net/acmain_chm/article/details/4126306
相关推荐
表:t_test -------------------------------------- id(int) cost(int) des Autoid(id) -------------------------------------- 1 10 aaaa 1 1 15 bbbb 2 1 20 cccc 3 ...取每一类id中cost最大的纪录
oracle某个字段多行记录转化为一行,oracle某个字段多行记录转化为一行。
sql查询表中某字段下所有重复的记录,删除某字段下重复记录最小的那笔记录
sql 查出一张表中重复的所有记录数据 1.表中有id和name 两个字段,查询出name重复的所有数据 select * from xi a where (a.username) in (select username from xi group by username having count(*) > 1) 2、...
本文是mysql 数据库 问题一 将表一的数据导入表二...在表中插入数据时,某一字段取数据库中该字段的最大值,并+1,这个问题很多人都说用存储过程什么的解决,其实使用insert 和 select 结合就可以很好的解决这个问题啊
如何获取当前行,如何截取表中某一条记录中某个字段的内容。
sql语句:按照某一个字段进行去重后获取全部字段。
按某一字段分组取最大(小)值所在行的数据
Delphi,判断记录是否存在,取某个特定字段值,取多个字段值 自己工作总结,逐步增加
求一个n个数的最大字段和问题,以及对其进行输出。基本的贪心算法问题。常用与研究生算法课程。
在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是...
C++的作业,最大字段和问题 分治法,程序直接用dev就能运行。求一个序列的最大子段和即最大连续子序列之和。例如序列[4, -3, 5, -2, -1, 2, 6, -2]
表中的记录随着增多,有些字段的数据会重复,这各可以帮你找出重复的数据
Java实现算法最大字段和
最大字段和的分治解法 最大字段和的分治解法
SQL查询包含某个字段的所有表名 SQL查询包含某个字段的所有表名 在查询分析器中选中目标数据库,执行以下语句。
Delphi合计数据库某字段值,具体到本例中,是统计学生成绩,将读取出来的数据库值 的成绩字段进行统计,合并出所有的成绩值。 try with query1 do begin close; sql.Clear; sql.Add('select avg(英语...
–按某一字段分组取最大(小)值所在行的数据 代码如下: /* 数据如下: nameval memo a 2 a2(a的第二个值) a 1 a1–a的第一个值 a 3 a3:a的第三个值 b 1 b1–b的第一个值 b 3 b3:b的第三个值 b 2 b2b2b2b2 b 4 b4b4 b ...
oracle lag 实现同一字段的前N行的数据和后N行的值.txt