`

分组后查找每组的前N条记录

 
阅读更多
考你一条sql语句
如有表 student 
id  name age  class 
1   张1   15     1
2   张2   15     1
3   张3   15     1
4   张4  15     2
5   张5   15     2
6   张6   15     2
7   张7   15     3
8   张8   15     3
9   张9   15     3
10   张10   15     5
11   张11   15     5
…………
现在想得到每个班级的前2名学生资料


根据题意是,按class分组,然后取id靠前的两名,相信大多数人都能想到基本组合:

SELECT a.*

FROM student a

ORDER BY a.class, a.id;

另加:Limit 0,2来配合。



(注:MYSQL 中没有top n的写法,取代的是LIMIT。)

Limit 0,n只能取到最前的n位,但如何能取到每个班的前两位呢,就无从下手了。



下面我来具体分析一下这题的解法:

1、获取每个class的前两位:

SELECT a.*

FROM student a

WHERE

(

  SELECT COUNT(*)

  FROM student

  WHERE class = a.class

  AND id < a.id

) < 2



#遍历所有记录,然后取该条记录与同班中的所有记录比较,只有当班上不超过两个人(含两个人)比该记录id小的话,该记录才被认定为该记录id排名前2,然后显示出来。



2、当获取所有合格的数据有,按class与id排序:

在最后添加:

ORDER BY a.class, a.id;



最终结果:

SELECT a. *
FROM student a
WHERE (

SELECT COUNT( * )
FROM student
WHERE class = a.class
AND id < a.id
) <2
ORDER BY a.class, a.id
LIMIT 0 , 30;

遍历所有记录,然后取该条记录与actionid中的所有记录比较,只有id不超过1个比该记录id小的话,该记录才被认定为该记录id为最大id,然后显示出来。

 SELECT a.*
FROM messagesend a
WHERE (
SELECT COUNT( * )
FROM messagesend t
WHERE t.actionid = a.actionid
AND id < a.id
) <1


分享到:
评论

相关推荐

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

    接着,函数通过遍历输入数组`$visit`中的每一个元素(即每一条浏览记录),对每条记录的`visittime`使用`date()`函数进行格式化处理,得到一个表示“月日”的字符串。如果该时间戳表示的时间与当前年份相同,则只取...

    MySQL数据结构-页结构.pdf

    - **n_owned**:如果记录是组内最大记录,表示槽内记录数。 - **heap_no**:记录在当前页中的位置信息。 - **record_type**:表示记录类型,0表示普通记录,1表示非叶子节点记录,2表示最小记录,3表示最大记录。 - ...

    基本排序算法综合实验.docx

    2. 将记录分组,每组大小为 h 3. 对每组记录,使用插入排序算法排序 4. 重复步骤 2 和 3,直到增量 h 为 1 ShellSort1 算法的时间复杂度是 O(n log n),比 InsertSort1 和 InsertSort2 更高效。 本实验报告涵盖了...

    数据结构上机报告4.doc

    希尔排序是插入排序的一种改进版本,通过增量序列将待排序序列分组,然后对每组进行插入排序,总体效率有所提升。冒泡排序通过相邻元素的比较和交换,逐步将较大的元素“冒”到序列末尾,平均时间复杂度为O(n^2)。...

    正则表达式的笔记记录呢

    `表示零次或一次,`{n}`表示恰好n次,`{n,}`表示至少n次,`{n,m}`表示n到m次。 - **锚点**:`^`表示行首,`$`表示行尾,`\b`表示单词边界。 - **转义字符**:`\`用于转义特殊字符,如`\.`匹配实际的点字符,`\d`...

    数据库内测版.doc

    在数据库查询中,交叉联接查询会生成所有可能的组合,如果A表有3条记录,B表有4条记录,那么最多可得到12条记录的组合结果。等值连接查询则根据两个表中指定列的相等条件进行连接,若A表有8条记录,B表有10条记录,...

    算法设计期末考试题第五章

    - 当n为偶数时,将n个元素分为n/2组,每组包含两个元素。对每组进行比较,找出较大的元素作为“胜者”,较小的元素作为“败者”。然后在所有“胜者”中找出最大值,在所有“败者”中找出最小值。这种方法最多需要...

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

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

    直接排序法,折半插入法,希尔排序法,快速排序法(c语言实现)

    希尔排序是一种基于插入排序的算法,通过将待排序的数组元素按某个增量分组,然后对每组使用直接插入排序算法排序。随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止...

    java-leetcode面试题解哈希表第49题字母异位词分组-题解.zip

    任务是将数组中的字符串分成不同的组,使得每个组内的字符串都是字母异位词。字母异位词是指组成它们的字母相同,但顺序可能不同的两个单词。例如,"anagram" 和 "nagaram" 就是字母异位词,而 "rat" 和 "car" 不是...

    数据结构课程设计实验报告_内部排序算法比较.doc

    希尔排序是插入排序的一种更高效的改进版本,通过设定一个增量序列,将待排序的元素按照增量分组,对每组进行直接插入排序,随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,...

    数据结构中排序方法的研究.pdf

    排序是数据处理中的一项基础而重要的操作,目的是将一组记录重新排列成特定的顺序。排序的主要目的在于方便数据的查找和管理。如果没有经过排序,查找特定数据的最坏时间复杂度为O(n)。如果先进行排序再采用二分查找...

    北大青鸟S1数据查询PPT

    - **解决的问题**:将数据按一个或多个字段值进行分组,以便对每个组进行聚合计算。 - **适用场合**:当需要统计每个类别的总和、平均值等时,如按课程ID分组查询每门课的平均分。 - **示例**:`GROUP BY ...

    数据库关系查询与链接

    4. **GROUP BY和聚合函数**:GROUP BY语句用于对数据分组,而聚合函数如SUM、MAX、MIN、AVG、COUNT等则用于计算每个组的统计信息。实验示例中的第六条查询`select dept, sum(salary) from employee group by dept`,...

    数据库原理及应用课件:第6章 数据操作语言.ppt

    - **使用TOP限制结果集**:在查询结果中只返回前N条记录,用于获取数据的前一部分。 - **将查询结果保存到新表中**:可以将查询结果作为一个新的表存储,方便后续使用。 课件中提供了几个具体的查询示例,例如: 1...

    排序 算法 数据结构中的各种排序算法

    希尔排序的核心思想是采用间隔为 h 的元素作为一组进行插入排序,随着 h 逐渐减小,最终变为 1,整个列表就被完全排序了。 ### 五、快速排序 快速排序是一种非常高效的排序算法,其基本思想是:通过一趟排序将待排...

    java排序算法汇总

    希尔排序是插入排序的一种更高效的改进版本,通过将待排序的元素按照一定的增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便...

    Oracle 常用命令大全

    这里 `column_name` 是分组依据,`SKIP n` 是每组之间的空行数。 - **COMPUTE**:在每组的末尾计算聚合值。 ```sql COMPUTE SUM OF column1 ON column2 ``` 以上是根据提供的部分文件内容总结出的 Oracle 常用...

Global site tag (gtag.js) - Google Analytics