首页 >数据库 >mysql教程 >如何在不使用排名函数的情况下在 SQL 中高效查找每组的最小值和最大值?

如何在不使用排名函数的情况下在 SQL 中高效查找每组的最小值和最大值?

Linda Hamilton
Linda Hamilton原创
2024-12-23 22:32:17737浏览

How to Efficiently Find Minimum and Maximum Values per Group in SQL Without Using Ranking Functions?

获取每组的最高和最小值

概述

本教程解决了如何检索具有最高或最小值的记录的问题每个组内的指定字段,而不依赖于排名(@Rank)。虽然这个最初的问题使用 @Rank 作为解决方案,但后续响应展示了使用连接的更有效方法。

解决方案

要获取每个组具有最高 OrderField 的行,请使用左外部join 和以下查询:

SELECT t1.*
FROM `Table` AS t1
LEFT OUTER JOIN `Table` AS t2
  ON t1.GroupId = t2.GroupId AND t1.OrderField < t2.OrderField
WHERE t2.GroupId IS NULL
ORDER BY t1.OrderField;

如果组内多个记录具有相同的 OrderField 并且您需要其中一个,则可以将条件扩展为如下所示:

SELECT t1.*
FROM `Table` AS t1
LEFT OUTER JOIN `Table` AS t2
  ON t1.GroupId = t2.GroupId 
        AND (t1.OrderField < t2.OrderField 
         OR (t1.OrderField = t2.OrderField AND t1.Id < t2.Id))
WHERE t2.GroupId IS NULL

此精炼查询确保仅当同一组 GroupId 中不存在具有较高 OrderField 值或具有较低 Id 值的相等 OrderField 的其他行 t2 时,才返回 t1。因此,它有效地检索每个组中具有最大 OrderField 的行。

优化

与早期涉及 @Rank 和子查询的方法相比,使用左外连接方法可以显着提高查询性能。左外连接可以利用 (GroupId, OrderField) 上的索引来优化访问。

关于 @Rank 的警告

使用 @Rank 的初始方法可能无法按预期运行,因为在处理第一个表后,@Rank 增量继续。要将表之间的 @Rank 重置为零,您需要引入额外的派生表,但这可能会导致优化不佳。

以上是如何在不使用排名函数的情况下在 SQL 中高效查找每组的最小值和最大值?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn