1

我有一张每小时温度的表格:

id   timestamp   temperature

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

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

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

任何建议将不胜感激。

4

3 回答 3

1

试试这个....

select max(temperature), timestamp from temp group by UNIX_TIMESTAMP(date(timestamp));
于 2013-07-18T12:06:40.343 回答
1

使用这样的子查询;

select  * from temp WHERE temperature=(select min(temperature) from temp)
于 2015-03-12T13:19:28.170 回答
1

选择每个日期的最高温度,然后将其放入温度和日期表的连接中,这将允许您选择与温度和日期匹配的行。在大多数情况下,连接会比子查询快,无论如何,您不能总是在子查询中分组。

用于date()从时间戳中获取日期部分,并将从存储为字符串或整数的 unix 时间戳中from_unixtime()获取 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而不是varcharor 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
于 2017-03-15T16:04:46.807 回答