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