使用 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中文网其他相关文章!