在mysql中使用group by进行分组后取某一列的最大值,我们可以直接使用MAX()函数来实现,但是如果我们要取最大值对应的ID
那么我们需要取得整行的数据该怎么办?
起初搜寻到的资料是这样的:
首先按照 create_time 倒叙排序,然后分组,那么每个分组中排在最上面的记录就是时间最大的记录
但是结果不是这样的,经过搜集资料,得出需要在排序后边加 limit 10000000000
如果不加的话,数据不会先进行排序,通过 explain 查看执行计划,可以看到没有 limit 的时候,少了一个 DERIVED *** 作。
为每一行记录添加行号
方法一:
为了实现row_number函数功能,此方法我们要使用到会话变量,下面的实例是从
employees
表中选出5名员工,并为每一行添加行号:
1
2
3
4
5
6
set@row_number
=
0;
select
(@row_number:=@row_number
+
1)
asnum,
firstname,
lastname
from
employees
limit
5;
输出结果:
在这个实例中:
首先,定义变量
@row_number
,并初始化为0;
然后,在查询时我们为
@row_number
变量加1。
方法二:
这种方法仍然要用到变量,与上一种方法不同的是,我们把变量当做派生表,与主业务表关联查询实现row_number函数功能。下面我们仍然以查询5位员工为例:
1
2
3
4
5
select
(@row_number:=@row_number
+
1)
asnum,
firstname,
lastname
from
employees,(select@row_number:=0)
ast
limit
5;
这样的输出结果与上一种结果是一致的。
需要注意的是,在这种方法中,派生表必须要有别名,否则执行时会出错。
为每一组添加行号
了解oracle的朋友应该知道,row_number函数还有一个非常有用的功能就是分组排序
“over
partition
by”
。mysql同样可以实现这样的功能,看下面的实例:
首先将payments表中按照客户将记录分组:
1
2
3
4
5
select
customernumber,
paymentdate,
amount
from
payments
orderbycustomernumber;
输出结果如下:
下面我们需要将每个客户添加一个行号,这里我们需要用到两个变量,一个用于存储行号,一个用于存储客户编号,如:
1
2
3
4
5
6
7
8
9
10
11
select
@row_number
:=
case
when@customer_no
=
customernumber
then@row_number
+
1
else1
endasnum,
@customer_no
:=
customernumber
asc
select
分组列1,分组列2,聚合列1,聚合列2
from表
groupby分组列1,分组列2
orderby分组列或聚合列
--------
分组查询中,做为查询结果显示的列,必须是用于分组的列,或者聚合的列
比如:sum(),count(),avg()等等
以上就是关于mysql使用GROUP BY分组实现取前N条记录的方法全部的内容,包括:mysql使用GROUP BY分组实现取前N条记录的方法、MySQL | 数据查询DQL语言:分组统计、MySQL 分组选出某值最大的一行数据(需要加 limit)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)