`

查出某个字段的最大记录和前N条记录

阅读更多

        经常会有查询数据库最大的记录或者前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数据库中将某个字段的多行记录转换为一行记录...通过这种方式,我们可以在Oracle数据库中轻松地将某个字段的多行记录转换为一行记录,极大地提高了数据处理的灵活性和效率。

    sql查询表中某字段下所有重复的记录

    sql查询表中某字段下所有重复的记录,删除某字段下重复记录最小的那笔记录

    SQL排除重复结果只取字段最大值分享

    如何用SQL排除重复结果只取字段最大值的记录?要求得到的结果(即是PID相同的记录只取ID值最大的那一条)。 代码如下:select * from [Sheet1$] awhere ID not exists (select 1 from [Sheet1$] where PID=a.PID and...

    MySQL根据某一个或者多个字段查找重复数据的sql语句

    sql 查出一张表中重复的所有记录数据 1.表中有id和name 两个字段,查询出name重复的所有数据 select * from xi a where (a.username) in (select username from xi group by username having count(*) &gt; 1) 2、...

    sql_按照某一个字段进行去重后获取全部字段

    在实际工作中,我们经常会遇到需要对数据表中的记录进行去重的情况,尤其是当某个字段作为唯一标识符时,我们希望能够基于这个字段获取最新的、唯一的或者汇总的数据记录。下面将详细阐述这一知识点。 ### SQL 去重...

    截取一条记录中某个字段内容

    描述中提到的“如何获取当前行”以及“如何截取表中某一条记录中某个字段的内容”进一步明确了这个问题,它涉及到数据库查询语言(如SQL)和可能的编程语言(如Python)中的操作。 首先,我们来讨论如何在SQL中获取...

    判断记录是否存在,取某个特定字段值,取多个字段值

    接下来是`GetFieldValue`函数,它的目的是获取指定SQL查询中某一字段的值。输入参数包括`sSql`(SQL查询字符串)、`sField`(目标字段名)和`Conn`(数据库连接对象)。同样地,创建`TADOQuery`对象并执行SQL,然后...

    insert和select结合实现”插入某字段在数据库中的最大值+1″的方法

    本文是mysql 数据库 问题一 将表一的数据导入表二...在表中插入数据时,某一字段取数据库中该字段的最大值,并+1,这个问题很多人都说用存储过程什么的解决,其实使用insert 和 select 结合就可以很好的解决这个问题啊

    如何查出同一张表中字段值重复的记录

    根据给定文件的信息,本文将详细探讨如何在数据库表中查找和处理字段值重复的记录。主要内容包括使用三种方法:ROWID、GROUP BY 和 DISTINCT,来查找和删除表中的重复记录。 ### 一、ROWID 方法 #### 1.1 查找重复...

    mysql分组取每组前几条记录(排名) 附group by与order by的研究

    –按某一字段分组取最大(小)值所在行的数据 代码如下: /* 数据如下: 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 ...

    按某一字段分组取最大(小)值所在行的数据

    按某一字段分组取最大(小)值所在行的数据

    在MSSQL中利用猜解出的表和字段得出记录

    假设你知道表名 `users` 和字段名 `username`,并且想要查询第 5 条记录,你可以尝试构造一个 SQL 语句,比如: ```sql SELECT * FROM users WHERE username = 'your_input' LIMIT 4, 1 ``` 这个语句会跳过前四...

    解析mysql不重复字段值求和

    在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是...

    SQL 取n到m条记录

    **方法三:** 使用`SELECT TOP n * FROM (SELECT TOP m * FROM table_name ORDER BY column_name) a ORDER BY column_name DESC`这种方式通过嵌套查询来实现,先获取前m条记录,再从中筛选出前n条记录。 **应用场景...

    java-操作记录-对比操作前后不同

    在Java编程语言中,操作记录是一项重要的任务,它涉及到对程序执行过程中的各种操作进行跟踪、记录和分析,以便于调试、性能优化或者问题排查。本篇将基于提供的"java-操作记录-对比操作前后不同"的jar文件,探讨...

    sql 在更新某字段后写入日志触发器

    本篇文章将详细介绍如何在SQL Server中创建一个触发器,当某个表中的特定字段被更新时,记录相关信息到另一个表中,以实现类似日志记录的功能。 #### 触发器概述 触发器是SQL Server提供的一种机制,可以在表或视图...

    BW DSO的记录模式Record Mode字段测试

    - N: NEW,表示一条新的记录 - U: UPDATE,表示一条记录被更新了 - D: DELETE,表示一条记录被删除了 - X: 表示记录是变化的,但具体是新增还是更新则需要进一步分析,通常是变化后的值 - I: 表示记录有数据,但是不...

    Delphi合计数据库某字段值.rar

    Delphi合计数据库某字段值,具体到本例中,是统计学生成绩,将读取出来的数据库值 的成绩字段进行统计,合并出所有的成绩值。  try  with query1 do  begin  close;  sql.Clear;  sql.Add('select avg(英语...

    SQLServer中如何将一个字段的多个记录值合在一行显示

    在实际应用中,我们经常需要将一个字段的多个记录值合并到一行显示,以便于数据分析和展示。在本文中,我们将介绍如何在 SQL Server 中将一个字段的多个记录值合并到一行显示,并提供相关的示例代码和实现方法。 ...

Global site tag (gtag.js) - Google Analytics