高效查找关系数据库中组内的最大值
提取包含特定列的最大值的行,同时维护关系数据库中的组完整性可能很复杂。本文解决了检索每个唯一 ID 具有最高轮数的行的挑战,优先考虑查询效率。
一种方法使用子查询:
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;
但是,由于后处理过滤步骤,这种方法效率低下。
为了提高性能,请考虑使用窗口函数:
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;
该查询使用窗口函数来确定每个 ID 的最大轮次,然后检索相应的分数。 DISTINCT
关键字确保每个 ID 一行。
可能更快的替代方案,使用相同的窗口函数两次:
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;
两种优化的解决方案都避免了不必要的过滤,与子查询方法相比,查询执行时间更快。
以上是如何高效检索关系数据库中每组最大值的行?的详细内容。更多信息请关注PHP中文网其他相关文章!