经常会有查询数据库最大的记录或者前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排除重复结果只取字段最大值的记录?要求得到的结果(即是PID相同的记录只取ID值最大的那一条)。 代码如下:select * from [Sheet1$] awhere ID not exists (select 1 from [Sheet1$] where PID=a.PID and...
sql 查出一张表中重复的所有记录数据 1.表中有id和name 两个字段,查询出name重复的所有数据 select * from xi a where (a.username) in (select username from xi group by username having count(*) > 1) 2、...
在实际工作中,我们经常会遇到需要对数据表中的记录进行去重的情况,尤其是当某个字段作为唯一标识符时,我们希望能够基于这个字段获取最新的、唯一的或者汇总的数据记录。下面将详细阐述这一知识点。 ### SQL 去重...
描述中提到的“如何获取当前行”以及“如何截取表中某一条记录中某个字段的内容”进一步明确了这个问题,它涉及到数据库查询语言(如SQL)和可能的编程语言(如Python)中的操作。 首先,我们来讨论如何在SQL中获取...
接下来是`GetFieldValue`函数,它的目的是获取指定SQL查询中某一字段的值。输入参数包括`sSql`(SQL查询字符串)、`sField`(目标字段名)和`Conn`(数据库连接对象)。同样地,创建`TADOQuery`对象并执行SQL,然后...
本文是mysql 数据库 问题一 将表一的数据导入表二...在表中插入数据时,某一字段取数据库中该字段的最大值,并+1,这个问题很多人都说用存储过程什么的解决,其实使用insert 和 select 结合就可以很好的解决这个问题啊
根据给定文件的信息,本文将详细探讨如何在数据库表中查找和处理字段值重复的记录。主要内容包括使用三种方法:ROWID、GROUP BY 和 DISTINCT,来查找和删除表中的重复记录。 ### 一、ROWID 方法 #### 1.1 查找重复...
–按某一字段分组取最大(小)值所在行的数据 代码如下: /* 数据如下: 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 ...
按某一字段分组取最大(小)值所在行的数据
假设你知道表名 `users` 和字段名 `username`,并且想要查询第 5 条记录,你可以尝试构造一个 SQL 语句,比如: ```sql SELECT * FROM users WHERE username = 'your_input' LIMIT 4, 1 ``` 这个语句会跳过前四...
在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是...
**方法三:** 使用`SELECT TOP n * FROM (SELECT TOP m * FROM table_name ORDER BY column_name) a ORDER BY column_name DESC`这种方式通过嵌套查询来实现,先获取前m条记录,再从中筛选出前n条记录。 **应用场景...
在Java编程语言中,操作记录是一项重要的任务,它涉及到对程序执行过程中的各种操作进行跟踪、记录和分析,以便于调试、性能优化或者问题排查。本篇将基于提供的"java-操作记录-对比操作前后不同"的jar文件,探讨...
本篇文章将详细介绍如何在SQL Server中创建一个触发器,当某个表中的特定字段被更新时,记录相关信息到另一个表中,以实现类似日志记录的功能。 #### 触发器概述 触发器是SQL Server提供的一种机制,可以在表或视图...
- N: NEW,表示一条新的记录 - U: UPDATE,表示一条记录被更新了 - D: DELETE,表示一条记录被删除了 - X: 表示记录是变化的,但具体是新增还是更新则需要进一步分析,通常是变化后的值 - I: 表示记录有数据,但是不...
Delphi合计数据库某字段值,具体到本例中,是统计学生成绩,将读取出来的数据库值 的成绩字段进行统计,合并出所有的成绩值。 try with query1 do begin close; sql.Clear; sql.Add('select avg(英语...
在实际应用中,我们经常需要将一个字段的多个记录值合并到一行显示,以便于数据分析和展示。在本文中,我们将介绍如何在 SQL Server 中将一个字段的多个记录值合并到一行显示,并提供相关的示例代码和实现方法。 ...