我有一张每小时温度的表格:
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()
从时间戳中获取日期部分,并将从存储为字符串或整数的 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
而不是varchar
or 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