`
DreamOne
  • 浏览: 8715 次
文章分类
社区版块
存档分类
最新评论

Mysql group by top N

 
阅读更多
Mysql group by top N的问题(转)
 
   在日常工作中,经常要查询分组的前几名.oracle中可以通过row_num来支持查询,mysql暂时不支持row_num.那么如何来完成这个需求呢?
 
   例如:
 
表中的数据:
 
1
2
3
4
5
6
7
8
9
10
+--------+-------+-----+
| Person | Group | Age |
+--------+-------+-----+
| Bob    | 1     | 32  |
| Jill   | 1     | 34  |
| Shawn  | 1     | 42  |
| Jake   | 2     | 29  |
| Paul   | 2     | 36  |
| Laura  | 2     | 39  |
+--------+-------+-----+

 

期望的结果:
 
1
2
3
4
5
6
+--------+-------+-----+
| Shawn  | 1     | 42  |
| Jill   | 1     | 34  |
| Laura  | 2     | 39  |
| Paul   | 2     | 36  |
+--------+-------+-----+

 

 
   方式一:借鉴oracle中row_num的思想,在sql中增加伪列.
1
2
3
4
5
6
7
8
9
10
11
12
set @num := 0, @group := '';
 
select person, `group`, age
from
(
   select person, `group`, age,
      @num := if(@group = `group`, @num + 1, 1) as row_number,
      @group := `group` as dummy
  from mytable
  order by `Group`, Age desc, person
) as x
where x.row_number <= 2;

 

方式二:利用关联子查询
1
2
3
4
SELECT a.person, a.group, a.age FROM person AS a WHERE
(SELECT COUNT(*) FROM person AS b
WHERE b.group = a.group AND b.age >= a.age) <= 2
ORDER BY a.group ASC, a.age DESC
分享到:
评论

相关推荐

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

    本文实例讲述了mysql使用GROUP BY分组实现取前N条记录的方法。分享给大家供大家参考,具体如下: MySQL中GROUP BY分组取前N条记录实现 mysql分组,取记录 GROUP BY之后如何取每组的前两位下面我来讲述mysql中GROUP BY...

    详解MySQL分组排序求Top N

    MySQL分组排序求Top N是数据库查询中一种常见的需求,特别是在数据分析、报表生成或数据挖掘等场景中。本文将深入探讨这一主题,帮助你理解如何在MySQL中有效地实现这一功能。 首先,我们要明白分组(GROUP BY)和...

    MySQL命令大全

    mysql&gt; select * from MyClass order by id limit 0,2; 或者: mysql&gt; select * from MyClass limit 0,2; 6、删除表中数据 命令:delete from 表名 where 表达式 例如:删除表 MyClass中编号为 的记录 mysql&gt;...

    SQL-Server与MySQL差别

    在 **SQL Server** 中,可以使用 `NEWID()` 结合 `ORDER BY NEWID()` 来随机排序记录,然后通过 `TOP` 获取前 N 条记录: ```sql SELECT TOP 10 * FROM TableName ORDER BY NEWID(); ``` 在 **MySQL** 中,则是使用 ...

    c# MySql与SQL sever的区别.docx

    - `TOP`关键字:SQL Server中用于限制返回的行数,如`SELECT TOP n * FROM table ORDER BY id DESC`;MySQL则使用`LIMIT`,如`SELECT * FROM table ORDER BY id DESC LIMIT n`。 - `GROUP BY`:SQL Server要求`...

    mysql数据库故障排除方案.pdf

    `mysql&gt;select table_schema,engine,round(sum(data_length+index_length)/1024/1024) as total_mb,round(sum(data_length)/1024/1024) as data_mb,round(sum(index_length)/1024/1024) as index_mb,count(*) as ...

    mysql5基础

    - **TOP**:在SQL Server中用于限制返回的记录数量,但MySQL不支持TOP,可以使用`LIMIT`关键字实现类似功能,例如:`SELECT column_name(s) FROM table_name LIMIT number`。 - **DISTINCT**:用于去除查询结果中...

    MySql_增删改查语句

    GROUP BY StudentID, CourseID HAVING COUNT(Score) &gt; 1; ``` #### 五、多表连接查询 **内连接(Inner Join):** - **在 WHERE 子句中指定连接条件:** ```sql SELECT Students.SName, Score.CourseID, Score...

    Mysql语法实例分享

    - `SELECT`语句用于获取表中的数据,可以配合`FROM`、`WHERE`、`GROUP BY`、`ORDER BY`等子句进行复杂查询。例如: ```sql SELECT * FROM students WHERE age &gt; 18 ORDER BY age DESC; ``` 6. **更新数据**: ...

    MySQL基础知识、操作

    SELECT语句非常灵活,可以通过各种子句和操作符来实现复杂的查询,如JOIN、WHERE、ORDER BY、GROUP BY等。 数据控制语言(DCL)涉及对数据库访问权限的控制,包括GRANT和REVOKE语句。GRANT用于给用户或角色授权,而...

    关于sql和mysql对于别名不能调用的一些理解

    比如,在 GROUP BY 或 ORDER BY 子句中,MySQL 通常要求直接使用原始列名,而不是别名。这与 SQL Server 或 Oracle 等其他数据库系统有所不同。这意味着以下代码在 MySQL 中可能会报错: ```sql SELECT column AS ...

    MySQL 80道面试题及答案.docx

    6. `GROUP BY`和`HAVING`:用于数据分组和条件过滤,常与聚合函数一起使用。 7. `JOIN`:用于合并多个表的数据。 8. `LIKE`和`REGEXP`:在查询中实现模糊匹配。 理解并熟练运用这些概念和功能,对于解决MySQL相关的...

    快速消费品数据分析mysql测试题-mysql.docx.docx

    3. 查询中分组使用 `GROUP BY` 命令,分组条件使用 `HAVING` 命令。 4. 三范式的内容为:第一范式(First Normal Form),确保每一列都是不可分割的基本数据项;第二范式(Second Normal Form),要求非主属性完全...

    Mysql CPU占用高的问题解决方法小结

    - **优化SQL语句**:例如,减少不必要的`GROUP BY`、`UNION`操作,或者为常用的查询字段创建索引。 ### 4. 优化数据库表结构 - **添加索引**:对于频繁作为查询条件的字段,应该添加索引以加快查询速度。例如,在...

    mysql 常用语句+实例

    - **语法:** `SELECT column_name, aggregate_function(column_name) FROM table_name GROUP BY column_name;` - **示例:** 统计每个部门的平均工资。 ```sql SELECT department, AVG(salary) FROM employees ...

    第10章MySQL视图.docx

    - 视图中不能包含`DISTINCT`、集合运算、分组函数(如`SUM`、`MAX`、`COUNT`等),也不能有`GROUP BY`、`ORDER BY`、`MODEL`、`START WITH`等语句。 - 视图不能包含伪列关键字,如`ROWNUM`。 - 如果视图不能直接更新...

    sql基本语句30条

    - **SQL Server**: `SELECT top n * from &lt;table_name&gt; order by newid();` - **MySQL**: `SELECT * From &lt;table_name&gt; Order By rand() Limit n;` **解释**:这些语句分别用于在Access、SQL Server和MySQL中随机...

    数据库多表查询及嵌套查询子查询语句示例

    5.用子查询作派生的表:select 年龄,count(*) as 相同年龄 from (select top 10 年龄 from kjbdsjk order by 编号) as t group by 年龄 6.把子查询作为表达式:select t.职业,t.平均年龄 from (select 职业,avg(年龄)...

Global site tag (gtag.js) - Google Analytics