300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > mysql:分组中某字段最大值的查询结果

mysql:分组中某字段最大值的查询结果

时间:2023-06-13 07:55:16

相关推荐

mysql:分组中某字段最大值的查询结果

最近在用一款组态软件,涉及到sql查询来得出数据集。需要在一定的限制下,得出想要的查询结果。某些查询的方法整理一下。

这次记录的是分组中某字段最大值的查询结果:

比如:从一张记录装置缺陷的表中,查询出每个装置的最新的一条缺陷记录。

正确的sql,下面这条语句是其中一种可行的方法:

SELECT t.*FROM (SELECT * FROM sms_equipment_defect ORDER BY faultTime DESC) tGROUP BY t.equipmentMrid ;

这个查询,即能查出sms_equipment_defect表中按照t.equipmentMrid分组,faultTime字段值最大的每条数据。

因为:首先mysql分组时,mysql 手册上面说,GROUP BY 时是按照某种顺序排序的,某种顺序到底是什么顺序?其实根本没有顺序。所以,需要用子查询对表中的内容进行排序,然后,再分组时,分组结果就是取得最上面的一条记录,即,每组中faultTime最大的那个记录。

备注:对于分组中某字段最大值的查询,一些错误的sql方法:

1、错误形式1:

SELECT * FROM sms_equipment_defect GROUP BYequipmentMridORDER BY faultTime DESC;

这条语句选择出来的每一条记录是最早的记录,原因是 group by 会比 order by 先执行,这样也就没有办法将 group by 之前,也就是在分组之前进行排序了。

2、错误形式2:

SELECT *,max(faultTime) as max_faultTimeFROM sms_equipment_defect GROUP BYequipmentMrid ORDER BY faultTime DESC

这条语句的没错是选出了最大发布时间,但是你可 以对比一下 faultTime和 max_faultTime并不相等,即不是同一条!(可能记录有相当的情况,就是分组的目标记录只有一条的时候!)

为 什么呢?原因很简单,这条语句相当于是 在group by 以后选出本组的最大的发布时间!对分组没有起到任何影响!因为SELECT子句是最后执行的!

3、错误形式3:

SELECT *,max(faultTime ) as max_line FROM sms_equipment_defect GROUP BYequipmentMrid HAVING faultTime =max(faultTime )

其实,这条错误语句,等同于下面的语句:

SELECT *,max(faultTime ) as max_line FROM sms_equipment_defect GROUP BYequipmentMrid HAVING count(*)=1 ;

faultTime =max(faultTime ) 只有在分组中的记录只有一条的时候才成立,原因很明白吧!只有一条他才会和本组的最大发布时间相等阿,(默认faultTime 为不重复的值)

---------------------

作者:yoyofu007

来源:CSDN

原文:/yoyofu007/article/details/82734608

版权声明:本文为博主原创文章,转载请附上博文链接!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。