如何取group by后最大值所对应的字符字段?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何取group by后最大值所对应的字符字段?相关的知识,希望对你有一定的参考价值。

表:test
id name num type
1 ddd 20 1
3 aaa 13 2
5 ccc 24 4
7 aee 30 2

select type,max(num),最大num所对应的名称和ID from test group type

需要查询的字段:最大num所对应的名称和ID

请指教 数据库为:sqlserver

参考技术A 你提的有点不太清楚,或许我理解问题 ,你要显示type这一列吗?是考虑type这一列的数据查找最大的num再查询对应的名称和ID,还是不考虑type这一列,直接最大的num
1、不考虑,如下
select name,id from test a where a.num=(select max(b.num) from test b )
2、考虑,如下
select name,id,type from test a where a.num=( select max(b.num) from test b where a.type=b.type group by type )本回答被提问者采纳
参考技术B select a.id,a.name,b.type,b.max_num
from test a,(
select type,max(num) as max_num
from test
group by type)as b
where a.type=b.type and a.num=b.max_num
参考技术C select name, id
from test t
where not exists (select 1 from test where num > t.num)

或者
select name, id from test where num = (select max(num) from test)

mysql通过group by分组取最大时间对应的数据,提供两种有效方法。

1、项目记录表project_record的结构和数据如下:

以下为项目记录表project_record的所有数据。project_id为项目Id,on_project_time为上项目时间。(每一条数据代表着上某个项目(project_id)的时间(on_project_time)记录)

2、我们的需求是:取出每个项目中最大上项目时间对应的那条数据。(即根据project_id分组,取出每组中最大的on_project_time对应的数据。)上方红框是我们要查出的数据

3、错误代码:

SELECT * 
FROM (SELECT * FROM project_record order by on_project_time desc) t 
GROUP BY project_id;

查询结果错误:

结果看似正确的,实则是错误的。每个项目最大的上项目时间能正确查出,但是数据对应的id不正确。

分析发现,对于每一个分组,分组后的结果总是取组中主键(id)最小的数据,即group by project_id 总会对project_id执行排序(正序)

 而不论临时表(t)中是否已排序,都会取组中主键id最小的一行数据。换句话说 临时表t 内的排序 无法影响外层的group by 的操作。

4、 正确方法如下:

方法一:

SELECT t1.*
FROM project_record t1
INNER JOIN (
SELECT DISTINCT(id) id
FROM project_record 
ORDER BY on_project_time DESC) AS t2 ON t2.id = t1.id
GROUP BY t1.project_id;

查询结果正确:

思路:需要关联一张表,这个关联表t2中的数据是对原表t1按照上项目时间倒叙排列,注意,此处必须使用distinct,此处distinct的作用可以理解为将t1表数据顺序固定为t2表顺序
主表GROUP BY 后会取出按条件分组后的第一条数据。

补充:关联t2表,如果有查询条件,需要将所有查询条件都写在关联的t2表中,如果写在主表的where中排序就失效了。后来发现的~

 

方法二:

select t1.*
FROM project_record t1
INNER JOIN (SELECT SUBSTRING_INDEX(GROUP_CONCAT(id ORDER BY on_project_time DESC),',',1) AS id
FROM project_record GROUP BY project_id) AS t2 ON t2.id = t1.id;

查询结果正确:

SUBSTRING_INDEX 用法:取排序后的分组的第一条数据。 

本人习惯使用第一种方法。

以上是关于如何取group by后最大值所对应的字符字段?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL之——GROUP BY分组取字段最大值

mysql通过group by分组取最大时间对应的数据,提供两种有效方法。

sql语言 怎么求每组最大,就是用group by 分组后,求每组某列最大?

关于MYSQL group by 分组按时间取最大值的实现方法!

sql如何取group by 分组的多条记录只取最上面的一条!

2018-07-10聚合函数+比较条件+''和NULL+DISTINCT+ORDER BY+LIMIT+GROUP BY