首页 >数据库 >mysql教程 >如何使用 SQL 的'GROUP BY”和'MAX”(或替代方案)检索最新信息?

如何使用 SQL 的'GROUP BY”和'MAX”(或替代方案)检索最新信息?

Barbara Streisand
Barbara Streisand原创
2024-12-26 02:38:11343浏览

How to Retrieve the Latest Information Using SQL's `GROUP BY` and `MAX` (or Alternatives)?

使用 SQL Group By & Max 检索最新信息

在某些场景下,需要检索分组的最新值或最大值按数据集中的特定列。其中一种常见的聚合是查找唯一值组合的最新信息。

考虑下表包含警报列表:

id name alarmId alarmUnit alarmLevel
1 test voltage psu warning
2 test voltage psu ceasing
3 test voltage psu warning
4 test temp rcc warning
5 test temp rcc ceasing

目标是仅检索最新的AlarmId 和 AlarmUnit 的每个组合的信息。预期结果应如下所示:

id name alarmId alarmUnit alarmLevel
3 test voltage psu warning
5 test temp rcc ceasing

可以使用多种方法来实现此结果。一种常见的方法涉及使用 ROW_NUMBER() 函数,该函数为每个组中的每一行分配一个排名。以下查询利用此函数:

SELECT *
FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY alarmId, alarmUnit ORDER BY id DESC) AS rn
    FROM mytable
) q
WHERE rn = 1

此查询返回alarmId 和alarmUnit 的每个组合的最新行。

适用于不支持 ROW_NUMBER() 函数的数据库,例如 MySQL,可以采用不同的方法:

SELECT mi.*
FROM (
    SELECT alarmId, alarmUnit, MAX(id) AS mid
    FROM mytable
    GROUP BY alarmId, alarmUnit
) mo
JOIN mytable mi
ON mi.id = mo.mid

此查询利用子查询来识别每个组合的最大 id AlarmId 和 AlarmUnit,然后将结果与原始表连接以检索相应的行。

在 PostgreSQL 8.3 及以下版本中,可以使用 DISTINCT ON 子句:

SELECT DISTINCT ON (alarmId, alarmUnit) *
FROM mytable
ORDER BY alarmId, alarmUnit, id DESC

此查询返回alarmId 和alarmUnit 的每个组合的第一个不同行,这有效地提供了最新信息。通过利用这些技术,开发人员可以有效地从数据中检索最新值,使他们能够根据最新的可用信息做出明智的决策。

以上是如何使用 SQL 的'GROUP BY”和'MAX”(或替代方案)检索最新信息?的详细内容。更多信息请关注PHP中文网其他相关文章!

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