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之后如何取每组的前两位下面我来讲述mysql中GROUP BY...
MySQL分组排序求Top N是数据库查询中一种常见的需求,特别是在数据分析、报表生成或数据挖掘等场景中。本文将深入探讨这一主题,帮助你理解如何在MySQL中有效地实现这一功能。 首先,我们要明白分组(GROUP BY)和...
mysql> select * from MyClass order by id limit 0,2; 或者: mysql> select * from MyClass limit 0,2; 6、删除表中数据 命令:delete from 表名 where 表达式 例如:删除表 MyClass中编号为 的记录 mysql>...
在 **SQL Server** 中,可以使用 `NEWID()` 结合 `ORDER BY NEWID()` 来随机排序记录,然后通过 `TOP` 获取前 N 条记录: ```sql SELECT TOP 10 * FROM TableName ORDER BY NEWID(); ``` 在 **MySQL** 中,则是使用 ...
- `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>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 ...
- **TOP**:在SQL Server中用于限制返回的记录数量,但MySQL不支持TOP,可以使用`LIMIT`关键字实现类似功能,例如:`SELECT column_name(s) FROM table_name LIMIT number`。 - **DISTINCT**:用于去除查询结果中...
- `SELECT`语句用于获取表中的数据,可以配合`FROM`、`WHERE`、`GROUP BY`、`ORDER BY`等子句进行复杂查询。例如: ```sql SELECT * FROM students WHERE age > 18 ORDER BY age DESC; ``` 6. **更新数据**: ...
SELECT语句非常灵活,可以通过各种子句和操作符来实现复杂的查询,如JOIN、WHERE、ORDER BY、GROUP BY等。 数据控制语言(DCL)涉及对数据库访问权限的控制,包括GRANT和REVOKE语句。GRANT用于给用户或角色授权,而...
比如,在 GROUP BY 或 ORDER BY 子句中,MySQL 通常要求直接使用原始列名,而不是别名。这与 SQL Server 或 Oracle 等其他数据库系统有所不同。这意味着以下代码在 MySQL 中可能会报错: ```sql SELECT column AS ...
6. `GROUP BY`和`HAVING`:用于数据分组和条件过滤,常与聚合函数一起使用。 7. `JOIN`:用于合并多个表的数据。 8. `LIKE`和`REGEXP`:在查询中实现模糊匹配。 理解并熟练运用这些概念和功能,对于解决MySQL相关的...
3. 查询中分组使用 `GROUP BY` 命令,分组条件使用 `HAVING` 命令。 4. 三范式的内容为:第一范式(First Normal Form),确保每一列都是不可分割的基本数据项;第二范式(Second Normal Form),要求非主属性完全...
- **优化SQL语句**:例如,减少不必要的`GROUP BY`、`UNION`操作,或者为常用的查询字段创建索引。 ### 4. 优化数据库表结构 - **添加索引**:对于频繁作为查询条件的字段,应该添加索引以加快查询速度。例如,在...
- **语法:** `SELECT column_name, aggregate_function(column_name) FROM table_name GROUP BY column_name;` - **示例:** 统计每个部门的平均工资。 ```sql SELECT department, AVG(salary) FROM employees ...
- 视图中不能包含`DISTINCT`、集合运算、分组函数(如`SUM`、`MAX`、`COUNT`等),也不能有`GROUP BY`、`ORDER BY`、`MODEL`、`START WITH`等语句。 - 视图不能包含伪列关键字,如`ROWNUM`。 - 如果视图不能直接更新...
- **SQL Server**: `SELECT top n * from <table_name> order by newid();` - **MySQL**: `SELECT * From <table_name> 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(年龄)...