MySQL:选择相应的行以按日期分组的最大值

时间:2013-07-18 11:55:10

标签: mysql sql database group-by max

我有一张每小时温度的桌子:

id   timestamp   temperature

我想选择每天的最高温度和相应的时间戳。

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

不起作用,因为它总是返回第一行的时间戳(但我需要来自温度最高的行的时间戳)。

任何建议都将不胜感激。

3 个答案:

答案 0 :(得分:1)

试试这个....

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

答案 1 :(得分:1)

使用像这样的子查询;

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

答案 2 :(得分: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