选择包含每天最大值的完整行

时间:2018-05-09 20:07:45

标签: mysql sql group-by

我的表格结构如下:

 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在同一天有多次出现最大值的可能性,在这种情况下我只想保留当天第一次出现该值。

2 个答案:

答案 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