首页 >数据库 >mysql教程 >如何高效检索关系数据库中每组最大值的行?

如何高效检索关系数据库中每组最大值的行?

Susan Sarandon
Susan Sarandon原创
2025-01-21 08:03:10965浏览

How Can I Efficiently Retrieve Rows with the Maximum Value per Group in a Relational Database?

高效查找关系数据库中组内的最大值

提取包含特定列的最大值的行,同时维护关系数据库中的组完整性可能很复杂。本文解决了检索每个唯一 ID 具有最高轮数的行的挑战,优先考虑查询效率。

一种方法使用子查询:

<code class="language-sql">SELECT * FROM
(SELECT id, round,
CASE WHEN (MAX(round) OVER (PARTITION BY id)) = round THEN score ELSE NULL END score
 FROM
 SCORES
 where id in (1,2,3)
) scorevals
WHERE
scorevals.round is not null;</code>

但是,由于后处理过滤步骤,这种方法效率低下。

为了提高性能,请考虑使用窗口函数:

<code class="language-sql">SELECT DISTINCT
       id
      ,max(round) OVER (PARTITION BY id) AS round
      ,first_value(score) OVER (PARTITION BY id ORDER BY round DESC) AS score
FROM   SCORES
WHERE  id IN (1,2,3)
ORDER  BY id;</code>

该查询使用窗口函数来确定每个 ID 的最大轮次,然后检索相应的分数。 DISTINCT 关键字确保每个 ID 一行。

可能更快的替代方案,使用相同的窗口函数两次:

<code class="language-sql">SELECT DISTINCT
       id
      ,first_value(round) OVER (PARTITION BY id ORDER BY round DESC) AS round
      ,first_value(score) OVER (PARTITION BY id ORDER BY round DESC) AS score
FROM   SCORES
WHERE  id IN (1,2,3)
ORDER  BY id;</code>

两种优化的解决方案都避免了不必要的过滤,与子查询方法相比,查询执行时间更快。

以上是如何高效检索关系数据库中每组最大值的行?的详细内容。更多信息请关注PHP中文网其他相关文章!

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