我有一个温度计,每天早上只要我的机器打开,它就会开始记录数据。
我想选择最低、最高和平均温度,以及机器每天打开和关闭时的温度。
我的表结构如下:
时间记录、日期记录、温度
我按记录的日期分组以获取当天的聚合,但我似乎找不到在记录的第一个和最后一个时间戳处选择温度的好方法。
有什么帮助吗?
我有一个温度计,每天早上只要我的机器打开,它就会开始记录数据。
我想选择最低、最高和平均温度,以及机器每天打开和关闭时的温度。
我的表结构如下:
时间记录、日期记录、温度
我按记录的日期分组以获取当天的聚合,但我似乎找不到在记录的第一个和最后一个时间戳处选择温度的好方法。
有什么帮助吗?
你想使用这样的windows函数:
select t.DateLogged, min(t.Temperature), max(t.Temperature), avg(t.Temperature),
max(case when t.seqnum_asc = 1 then t.Temperature end) as FirstTemperature,
max(case when t.seqnum_desc = 1 then t.Temperature end) as LastTemperature,
from (select t.*,
row_number() over (partition by dateLogged order by timeLogged) as seqnum_asc,
row_number() over (partition by dateLogged order by timeLogged desc) as seqnum_desc
from t
) t
group by t.DateLogged
order by DateLogged
这样做是添加两个新变量。seqnum_asc
从第一个读数 ( )开始,从 1 开始枚举一天中的值。另一个枚举有 1 个for the last reading (
seqnum_desc`)。
为了获得这些值,使用了条件求和。
min()
如果你喜欢,你实际上可以使用和max()
作为窗口函数做几乎相同的事情,而不是row_number()
:
select t.DateLogged, min(t.Temperature), max(t.Temperature), avg(t.Temperature),
max(case when timeLogged = mintime then t.Temperature end) as FirstTemperature,
max(case when timeLogged = maxtime then t.Temperature end) as LastTemperature,
from (select t.*,
min(timeLogged) over (partition by dateLogged) as minTime,
max(timeLogged) over (partition by dateLogged) as maxTime
from t
) t
group by t.DateLogged
order by DateLogged