我的表格结构如下:
sensor_id | timestamp | value
-----------|------------|-------
1 | 1516905900 | 100.1
4 | 1516916920 | 90.4
... | ... | ...
我需要为给定的sensor_id选择每天具有最大值的列。我需要与结果中每个最大值相关联的时间戳。
我使用MAX()和GROUP BY以及DATE_FORMAT取得了一些成功,但我无法通过查询来包含与每个组的最大值关联的时间戳。
这是我到目前为止所做的:
select DATE_FORMAT(from_unixtime(timestamp), '%m/%d/%Y') as x, max(value) from sensor_log where sensor_id=6 group by x;
结果仅包含x和max(值)列。我认为有可能使用某种JOIN来获得其余的列,但我还没有能够弄明白。
我可以预见的另一个问题是sensor_id在同一天有多次出现最大值的可能性,在这种情况下我只想保留当天第一次出现该值。
答案 0 :(得分:0)
嗯。这听起来像是一个很好地使用相关的子查询与扭曲:
select date(from_unixtime(sl.timestamp)) as dte, sl.sensor_id, sl.value, sl.timestamp
from sensor_log sl
where sl.timestamp = (select sl2.timestamp
from sensor_log sl2
where sl2.sensor_id = sl.sensor_id and
date(from_unixtime(sl2.timestamp)) = date(from_unixtime(sl.timestamp))
order by sl2.value desc, sl.timestamp asc
limit 1
);
答案 1 :(得分:0)
从MySQL版本8开始,可以使用排名函数dense_rank
来完成。
select sensor_id,timestamp,value,DATE_FORMAT(from_unixtime(timestamp),'%m/%d/%Y') as dt
from (select t.*
,dense_rank() over(partition by DATE_FORMAT(from_unixtime(timestamp),'%m/%d/%Y') order by value desc) as rnk
from tbl t
) t
where rnk=1