Mysql

每個帶有 INNER JOIN 的 GROUP 的最新值

  • February 8, 2021

我每 X 分鐘使用感測器獲取溫度和濕度。

我有一張感測器表和一張結果表。

tb_sensors:

tb_sensors

tb_results:

tb_results

我想獲得每個感測器的最新測量值(MAX(日期))。

我正在使用這個:

SELECT id_sens, pos_sens, temp_res, humi_res, MAX(date_res) FROM tb_sensors
INNER JOIN tb_results ON tb_sensors.pk_sens = tb_results.fk_sens
GROUP BY id_sens ORDER BY id_sens

我期望得到:

預期結果

但結果是:

查詢結果

我已經將最新日期與第一個 ID、位置、溫度和濕度混合在一起。

我該如何解決這個問題?

大多數數據庫系統甚至不允許您編寫的語法,因為從數據庫引擎的角度來看它有點荒謬。但是,如果我對您的理解正確,則基本上您想要每個感測器的MAX(date_res)

實現這一點的方法可能會因您使用的數據庫系統而異,因此您應該始終使用數據庫系統和版本來標記您的問題,但這裡有一個適用於大多數關係數據庫系統的答案:

WITH CTE_Results_Sorted AS
(
   SELECT fk_sens, temp_res, humi_res, date_res, ROW_NUMBER() OVER (PARTITION BY fk_sens ORDER BY date_res DESC) AS SortId -- Generates a unique ID (assuming each date is unique per sensor) for each sensor result, sorted by date descending
   FROM tb_results
)

SELECT id_sens, pos_sens, temp_res, humi_res, date_res
FROM tb_sensors
INNER JOIN CTE_Results_Sorted results ON tb_sensors.pk_sens = results.fk_sens
WHERE SortId = 1 -- Filter out everything but the latest date results row per sensor
ORDER BY id_sens

引用自:https://dba.stackexchange.com/questions/284929