2013-07-18 76 views
0

分組我有一個小時的溫度表格最大值選擇相應的行:MySQL的:通過日期

id timestamp temperature 

我要選擇的最高溫度和每一天的相應時間戳。

select max(temperature), timestamp from table group by date(from_unixtime(timestamp)) 

不起作用,因爲它總是返回第一行的時間戳(但我需要具有最高溫度的行的時間戳)。

任何建議將不勝感激。

回答

1

試試這個....

select max(temperature), timestamp from temp group by UNIX_TIMESTAMP(date(timestamp)); 
+0

date()不適用於unix時間戳... – Daniel

1

使用子查詢這樣的;

select * from temp WHERE temperature=(select min(temperature) from temp) 
1

選擇每個日期的最高溫度,然後把裏面的聯接回的溫度和日期表,這將允許您選擇匹配的溫度和日期的行。無論如何,在大多數情況下,聯接的速度會比子查詢的速度快,而且不能總是在子查詢中進行組合。

使用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,而不是varcharint,並插入數據時做一次轉換,而不必把它整個查詢。它會讓事情更容易閱讀和長期維護。這是同樣的查詢,如果您更改時間戳是一個實際的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 
+0

請解釋您的答案,以便其他人可以學習! :-) – Shawn

+0

我敢肯定,我已經過度表達了它。 –