分組我有一個小時的溫度表格最大值選擇相應的行:MySQL的:通過日期
id timestamp temperature
我要選擇的最高溫度和每一天的相應時間戳。
select max(temperature), timestamp from table group by date(from_unixtime(timestamp))
不起作用,因爲它總是返回第一行的時間戳(但我需要具有最高溫度的行的時間戳)。
任何建議將不勝感激。
分組我有一個小時的溫度表格最大值選擇相應的行:MySQL的:通過日期
id timestamp temperature
我要選擇的最高溫度和每一天的相應時間戳。
select max(temperature), timestamp from table group by date(from_unixtime(timestamp))
不起作用,因爲它總是返回第一行的時間戳(但我需要具有最高溫度的行的時間戳)。
任何建議將不勝感激。
試試這個....
select max(temperature), timestamp from temp group by UNIX_TIMESTAMP(date(timestamp));
使用子查詢這樣的;
select * from temp WHERE temperature=(select min(temperature) from temp)
選擇每個日期的最高溫度,然後把裏面的聯接回的溫度和日期表,這將允許您選擇匹配的溫度和日期的行。無論如何,在大多數情況下,聯接的速度會比子查詢的速度快,而且不能總是在子查詢中進行組合。
使用date()
從時間戳中獲取日期部分,from_unixtime()
將從存儲爲字符串或整數的unix時間戳中獲取mySQL timestamp
。
SELECT temperature, timestamp
FROM temp t
JOIN (
SELECT date(from_unixtime(timestamp)) as dt,
max(temperature) as maxTemp
FROM temp
GROUP BY date(from_unixtime(timestamp))
) m ON (
t.temperature = m.maxTemp AND
date(from_unixtime(t.timestamp)) = m.dt
)
不過,我會建議改變表中的時間戳存儲爲timestamp
,而不是varchar
或int
,並插入數據時做一次轉換,而不必把它整個查詢。它會讓事情更容易閱讀和長期維護。這是同樣的查詢,如果您更改時間戳是一個實際的timestamp
:
SELECT temperature, timestamp
FROM temp t
JOIN (
SELECT date(timestamp) as dt,
max(temperature) as maxTemp
FROM temp
GROUP BY date(timestamp)
) m ON (
t.temperature = m.maxTemp AND
date(t.timestamp) = m.dt
)
只是一個小更易於閱讀,並可能更快,這取決於你有多少數據。你也可以使用隱式聯接編寫,這可能更容易閱讀。取決於你的口味。
SELECT temperature, timestamp
FROM temp t, (
SELECT date(timestamp) as dt,
max(temperature) as maxTemp
FROM temp
GROUP BY date(timestamp)
) m
WHERE t.temperature = m.maxTemp
AND date(t.timestamp) = m.dt
請解釋您的答案,以便其他人可以學習! :-) – Shawn
我敢肯定,我已經過度表達了它。 –
date()不適用於unix時間戳... – Daniel