SQL函数,用于查看近间隔的数据
我试图确定是否存在某种SQL函数,允许我查看附近的数据间隔,将它们聚合到其他聚合函数中 我的当前数据如下所示,每5分钟发生一次,每个实体在给定的时间段内每天有一个条目SQL函数,用于查看近间隔的数据,sql,sql-server,date,window-functions,gaps-and-islands,Sql,Sql Server,Date,Window Functions,Gaps And Islands,我试图确定是否存在某种SQL函数,允许我查看附近的数据间隔,将它们聚合到其他聚合函数中 我的当前数据如下所示,每5分钟发生一次,每个实体在给定的时间段内每天有一个条目 实体A 20200201 00:10:00 21.0 实体A 20200201 00:15:00 23.0 实体A 20200201 00:20:00 23.0 实体A 20200200:15:0022.1 实体A 20200203 00:15:00 13.3 我已经有了几个聚合函数来查看时间范围内的整个数据系列,我给它提
- 实体A 20200201 00:10:00 21.0
- 实体A 20200201 00:15:00 23.0
- 实体A 20200201 00:20:00 23.0
- 李>
- 实体A 20200200:15:0022.1
- 实体A 20200203 00:15:00 13.3
DECLARE @TimeFrame DateTime = '00:15:00'
(SELECT stdevp(convert(decimal(19,6), facts.ActualValue))
FROM FactsDTValue as Facts
LEFT JOIN DimTime DT on Facts.TimeKey = DT.TimeKey
Where DT.TimeName24 = @TimeFrame
Group by Fact.Entity);
我想为上面的函数做的是一个简单的函数,它可以在更大范围内应用到00:15左右的时间范围内
因此,有效地说,如果参数是pass 00:15,并且假设我将另一个参数设置为3,那么它将得到序列中每天的facts.ActualValue的值。。不仅仅是执行聚合函数的单个值,如STDDEVP、AVERAGE、MAX、MIN、Median、Mode等
我正在使用MS SQL Server 2016;实现这一点的最佳方法是什么?是否有一个函数可以自动执行此操作,或者我可能只是缺少一些非常简单的功能?您可以使用窗口函数执行此操作。逻辑是使用
row\u number()
枚举每个实体和每天的行,然后标识每个分区中时间与参数匹配的行的行号。然后可以使用该信息进行过滤
假设表中的列是entity
(实体)、ts
(日期时间列)和val
(值),则为:
select entity, cast(ts as day) ts_day, stdevp(val) val_stdevp
from (
select
t.*,
max(case when cast(ts as time) = @TimeFrame then rn end)
over(partition by entity, cast(ts as date)) rn0
from (
select
t.*,
row_number() over(partition by entity, cast(ts as date) order by ts) rn
from mytbale t
) t
) t
where rn between rn0 - 3 and rn0 + 3
group by entity, cast(ts as day)
这将为每个实体和每天提供一条记录,其中包含7条目标记录的值的
stdevp()
。您研究过窗口函数吗?谢谢。这让我非常接近。。不太好。。但是非常接近。明天需要用新的眼光再看一眼。我不清楚为什么rn0+/-3出现在查询的外部边缘,作为DATEADD(秒,-@tempoffecs,@TimeFrame)和DATEADD(秒,@tempoffecs,@TimeFrame)之间的,在最深的查询中,它与我非常接近,但我认为这个整体解决方案更容易实现其他一些功能。