从表中选择特定日期的最高温度

bejyjqdl  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(332)

我有一张表,上面有下列数据

Temperature    DateTimeValue         WarnCrit
29.1        2020-06-22 10:08:30         0
29.2        2020-06-22 09:38:28         0
29.2        2020-06-22 09:08:26         0
28.9        2020-06-22 08:38:26         0
28.7        2020-06-22 08:08:24         0
28.7        2020-06-22 07:38:22         0
29.2        2020-06-22 07:08:21         0
29.8        2020-06-22 06:38:20         0
29.9        2020-06-22 06:08:18         0

我喜欢做一个选择,以找到在特定日期的最高,最低,平均温度,所以我使用以下:

SELECT max(Temperature) as maxtemp
     , min(Temperature) as mintemp
     , avg(Temperature) as avtemp 
  FROM TempHistory 
 WHERE date(DateTimeValue)='2020-06-22'

这项工作是正确的,但我也喜欢有这个温度发生的具体时间。所以我把它改成:

SELECT * 
  from TempHistory 
 where DateTimeValue = '2020-06-22' 
   and Temperature = (select max(Temperature) from TempHistory)

而这个什么也没回报。

qhhrdooz

qhhrdooz1#

您可以使用窗口函数,尤其是 first_value() :

SELECT DISTINCT max(Temperature) OVER () as maxtemp,
       min(Temperature) OVER () as mintemp,
       avg(Temperature) OVER () as avtemp,
       FIRST_VALUE(DateTimeValue) OVER (ORDER BY Temperature ASC) as dt_at_min,
       FIRST_VALUE(DateTimeValue) OVER (ORDER BY Temperature DESC) as dt_at_max
FROM TempHistory 
WHERE DateTimeValue >= '2020-06-22' AND
      DateTimeValue < '2020-06-23';

不幸的是,mysql(以及一般的sql)没有“first”或“last”聚合函数。然而,这是非常相似的。
还要注意 WHERE . 这允许查询使用上的索引 DateTimeValue --如果有的话。

7d7tgy0s

7d7tgy0s2#

如果没有领带(或者你不在乎),你可以这样写:

select t.* 
from TempHistory t
where t.DateTimeValue = (
    select t1.DateTimeValue
    from TempHistory t1
    where t1.DateTimeValue >= '2020-06-22' and t1.DateTimeValue < '2020-06-23'
    order by Temperature desc
    limit 1
)

理论基础:
你的日期有时间部分,所以你需要一个不平等的过滤器
使用返回最高温度日期的子查询比使用温度本身更简单(因此,不需要在外部查询中筛选日期)
如果你想要一天中温度最低的那排,你可以把它去掉 descorder by 条款。

相关问题