我有一张每小时温度的桌子:
id timestamp temperature
我想选择每天的最高温度和相应的时间戳。
select max(temperature), timestamp from table group by date(from_unixtime(timestamp))
不起作用,因为它总是返回第一行的时间戳(但我需要来自温度最高的行的时间戳)。
任何建议都将不胜感激。
答案 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
而不是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