Mysql
每個帶有 INNER JOIN 的 GROUP 的最新值
我每 X 分鐘使用感測器獲取溫度和濕度。
我有一張感測器表和一張結果表。
tb_sensors
:
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