`

分组取前N记录

 
阅读更多

(转)http://blog.csdn.net/acmain_chm/article/details/4126306

经常看到问题,如何取出每组的前N条记录。方便大家参考于是便把常见的几种解法列出于下。


问题:有表 如下,要求取出各班前两名(允许并列第二)
Table1
+----+------+------+-----+
| id |SName |ClsNo |Score|
+----+------+------+-----+
|  1 |AAAA  |  C1  | 67  |
|  2 |BBBB  |  C1  | 55  |
|  3 |CCCC  |  C1  | 67  |
|  4 |DDDD  |  C1  | 65  |
|  5 |EEEE  |  C1  | 95  |
|  6 |FFFF  |  C2  | 57  |
|  7 |GGGG  |  C2  | 87  |
|  8 |HHHH  |  C2  | 74  |
|  9 |IIII  |  C2  | 52  |
| 10 |JJJJ  |  C2  | 81  |
| 11 |KKKK  |  C2  | 67  |
| 12 |LLLL  |  C2  | 66  |
| 13 |MMMM  |  C2  | 63  |
| 14 |NNNN  |  C3  | 99  |
| 15 |OOOO  |  C3  | 50  |
| 16 |PPPP  |  C3  | 59  |
| 17 |QQQQ  |  C3  | 66  |
| 18 |RRRR  |  C3  | 76  |
| 19 |SSSS  |  C3  | 50  |
| 20 |TTTT  |  C3  | 50  |
| 21 |UUUU  |  C3  | 64  |
| 22 |VVVV  |  C3  | 74  |
+----+------+------+-----+

结果如下
+----+------+------+-----+
| id |SName |ClsNo |Score|
+----+------+------+-----+
|  5 |EEEE  |  C1  | 95  |
|  1 |AAAA  |  C1  | 67  |
|  3 |CCCC  |  C1  | 67  |
|  7 |GGGG  |  C2  | 87  |
| 10 |JJJJ  |  C2  | 81  |
| 14 |NNNN  |  C3  | 99  |
| 18 |RRRR  |  C3  | 76  |
+----+------+------+-----+

方法一:
select a.id,a.SName,a.ClsNo,a.Score
from Table1 a left join Table1 b on a.ClsNo=b.ClsNo and a.Score<b.Score
group by a.id,a.SName,a.ClsNo,a.Score
having count(b.id)<2
order by a.ClsNo,a.Score desc

方法二:

select *
from Table1 a
where 2>(select count(*) from Table1 where ClsNo=a.ClsNo and Score>a.Score)
order by a.ClsNo,a.Score desc

 

方法三:
select *
from Table1 a
where id in (select id from Table1 where ClsNo=a.ClsNo order by Score desc limit 2)
order by a.ClsNo,a.Score desc

 

方法....

这里列出了多种SQL语句的实现方法,有些是MySQL特有的(Limit, 其它数据库可根据实际更改,比如oracle的rownum,MS SQL SERVER 的 top,..),有时是SQL标准支持的。但效率上和应用的场合或许不同。具体应用时可根据实际表中的记录情况,索引情况进行选择。

 

 

特例 N=1 ,即取最大的/最小的一条记录。
+----+------+------+-----+
| id |SName |ClsNo |Score|
+----+------+------+-----+
|  5 |EEEE  |  C1  | 95  |
|  7 |GGGG  |  C2  | 87  |
| 14 |NNNN  |  C3  | 99  |
+----+------+------+-----+

 

select * 
from Table1 a
where not exists (select 1 from Table1 where ClsNo=a.ClsNo and Score>a.Score);

 

 

select a.* 
from Table1 a inner join (select ClsNo, max(Score) as mScore from Table1 group by ClsNo) b
 on a.ClsNo=b.ClsNo and a.Score=b.Score


select *
from (select * from Table1 order by Score desc) t
group by ClsNo



分享到:
评论

相关推荐

    mysql使用GROUP BY分组实现取前N条记录的方法

    GROUP BY之后如何取每组的前两位下面我来讲述mysql中GROUP BY分组取前N条记录实现方法。 这是测试表(也不知道怎么想的,当时表名直接敲了个aa,汗~~~~): 结果: 方法一: 代码如下:SELECT a.id,a.SName,a.ClsNo...

    分组并排序取前N

    标题“分组并排序取前N”涉及到数据库查询中的一个重要概念,这通常指的是在SQL查询中使用`GROUP BY`、`ORDER BY`以及`LIMIT`子句来对数据进行分组、排序,并提取出每组中排名靠前的N条记录。在数据库管理中,这种...

    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 ...

    MySql实现分组取n条最大记录.txt

    本篇文章详细介绍了如何使用MySQL实现分组取n条最大记录的功能。通过精心设计的SQL查询语句,我们可以有效地解决这类问题。这种方法不仅适用于上述具体场景,还可以扩展应用于其他类似的需求,例如按不同标准分组并...

    Hive中分组取topN_row_number-rank和dense_rank的使用.pdf

    在这篇文档中,我们将详细学习在Hive中如何进行分组取topN,以及如何使用row_number()、rank()和dense_rank()三种窗口函数进行数据排序和排名。 首先,Hive中的数据表创建和数据插入操作是数据查询和分析的前提。...

    如何制作排名前N名的分组报表

    最后,**取其前N**,即筛选出每个组别中的前N个记录,通常是最高或最低的N个。在数据查询界面,针对“Grouping Columns”的列设置“TopN”选项。点击“Grouping Options”,在弹出的界面中,你可以设置前N或后N的...

    Python视频教程之pandas groupby 分组取每组的前几行记录方法.pdf

    在实际工作中,我们经常需要对数据进行分组操作,并从每个组中提取特定的记录,例如每组的前几行。`groupby`函数是pandas中实现这一功能的关键,结合`head()`方法,可以方便地完成这一任务。下面我们将详细讲解如何...

    SQL 每组前N条记录

    打个比方你要查询每月排名前十的那些记录,或者每月销售前十的车辆。

    pandas groupby 分组取每组的前几行记录方法

    本篇文章将深入探讨如何使用 `pandas groupby` 分组并获取每组的前几行记录。 `pandas groupby` 方法允许我们将数据按照一个或多个列的值进行分组,这样可以对每个分组执行聚合操作,如计算平均值、求和、计数等。...

    SQL中Group分组获取Top N方法实现可首选row_number

    在SQL查询中,当需要对分组数据进行排序并选取每组的前N个记录时,通常会使用几种不同的技术。这里我们主要讨论四种方法:游标方法、Count查询、Cross Apply方法以及Row_Number函数,并重点分析在大量数据下哪种方法...

    PB 纵向显示N-UP类型的数据窗口例子

    "N-UP"是数据窗口的一个特殊显示模式,它允许在同一页面上并排显示多条记录,通常用于打印报表或者对比分析。在这个“PB 纵向显示N-UP类型的数据窗口例子”中,我们将探讨如何实现这种显示模式。 首先,我们需要...

    MySQL获取所有分类的前N条记录

    在MySQL数据库中,获取每个分类的前N条记录是一个常见的查询需求,特别是在处理如文章、商品、用户等分组信息时。以下将详细介绍如何通过SQL语句实现这一功能,并给出三个示例。 首先,我们需要理解基本的SQL语法,...

    PHP 实现浏览记录并按日期分组

    为了实现对浏览记录的分组,本文提供了一个示例函数`groupVisit`,该函数接收一个包含多个访问记录的数组作为输入,并按照记录中的访问时间戳`visittime`对记录进行分组。分组的依据是日期,相同日期的记录会被归类...

    SQL SERVER 分组求和sql语句

    您可能感兴趣的文章:分组后分组合计以及总计SQL语句(稍微整理了一下)MYSQL每隔10分钟进行分组统计的实现方法mysql使用GROUP BY分组实现取前N条记录的方法详解MySQL中的分组查询与连接查询语句sql server如何利用...

    SQLServer ntile获取每组前10%的数据

    例如,如果一个表有数百万行,我们可能只想看每个业务单元(如客户ID、产品ID等)的前10%记录,以进行初步分析或性能评估。`NTILE`函数可以帮助我们在不牺牲效率的情况下完成这个任务。 总结起来,`NTILE`函数是SQL...

    正则文本数据提取器(2)-可记录历史表达式

    `, `{n}`, `{n,}` 和 `{n,m}` 分别表示零个或多个、一个或多个、零个或一个、精确匹配n个、至少n个但不超过m个前面的字符或字符组。 3. **分组**:使用圆括号`()`将多个字符组合成一个整体,可以作为一个单位来处理...

    几种排序比较以及算法实现

    在待排序的 n 个记录中任取一个记录(通常取第一个记录),把该记录放入适当位置后,数据序列被此记录划分成两部分。所有关键字比该记录关键字小的记录放置在前一部分,所有比它大的记录放置在后一部分,并把该记录...

    对于计算机信息排序算法处理-计算机科学与技术本科毕业设计.doc

    * Shellsort():希尔排序算法,先取定一个正整数 d1&lt;n,把全部记录分成 d1 个组,所有距离为 d1 倍数的记录放在一组中,在各组内进行插入排序,然后取 d2重复上述分组和排序工作,直至取 di=1,即所有记录放在一个组...

Global site tag (gtag.js) - Google Analytics