2016-02-09 44 views
0

我有一個包含三列和數百萬行數據的表。使用max()函數返回最舊的行而不是匹配的行的值的SELECT語句

sensor_data

sensor_id int PK 
date datetime PK, 
data decimal (10,3) 

該查詢返回最近的傳感器4日期間,但對於傳感器4最早的數據:

select max(date), data 
from sensor_data 
where sensor_id = 4; 

這些查詢的數據返回正確的值:

select date, data 
from sensor_data 
where sensor_id = 4 
and date = (select max(date) from sensor_data where sensor_id = 4) 
order by date desc; 

select date, data 
from sensor_data 
where sensor_id = 4 
order by date desc 
limit 1; 

我是MySQL的新手。我是否使用max()錯誤,或者它是如何工作的?

+0

允許該查詢是MySQLism,它不是一個真正有效的SQL查詢。它的意思是「從符合條件的行中獲取最大日期和_any_數據。」大多數(如果不是所有)其他RDBMS都完全拒絕查詢,因爲您必須在任何沒有聚集的字段上使用聚合函數(a'la max/min)或GROUP BY。 –

+0

@JoachimIsaksson:這已經有一段時間了,但我可以發誓在SQL Server中這樣做。 – Dave

+0

SQL Server失敗,「列'sensor_data.data'在選擇列表中無效,因爲它不包含在聚合函數或GROUP BY子句中。」 –

回答

1

這是由於混合聚合函數與非聚合列。在PostgreSQL中,這將是一個錯誤,但在MySQL中,您會從用於非聚合列值的行中獲取任意條目。

+2

在mysql中,這種行爲可以通過服務器的sql模式設置進行配置。由於默認情況下,默認情況下禁用了MySQL 5.7.5的寬鬆組,但在此之前它是默認允許的。隨着舊設備的升級,我們希望能夠看到更少的這些問題。 – Shadow

+0

@Shadow我不知道它會在新的MySQL中被「修復」。我只能說「萬歲!」 :) –

+0

@JoachimIsaksson你不是唯一的,我會說:D – Shadow

0

您可以只用降序排列的結果:

SELECT data FROM sensor_data WHERE sensor_id = 4 ORDER BY date DESC LIMIT 1; 

正如其他地方提到,MAX()是一個聚合函數,爲了與GROUP BY使用。

相關問題