sql server—查看相邻间隔数据的sql函数

jljoyd4f  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(322)

我试图确定是否有某种sql函数允许我查看附近的数据间隔,将它们聚合到其他聚合函数中。
我当前的数据如下所示,每5分钟发生一次,每个实体在给定的时间段内每天有一个条目。
实体A 20200201 00:10:00 21.0
实体A 20200201 00:15:00 23.0
实体A 20200201 00:20:00 23.0
...
实体A 20200202 00:15:00 22.1
...
实体A 20200203 00:15:00 13.3
我已经有几个聚合函数来查看时间框架的整个数据系列,我给它一个参数,告诉它一天中的什么时间,我想简单地把“00:15”看作一个参数(声明为datetime),通过join facts.timekey=4,它是“00:15”,它是一天中的第四个5分钟间隔。
--简化的函数,假设只有一个实体。

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等。
00:00 (-3)
00:05 (-2)
00:10 (-1)
00:15 (0)
00:20 (+1)
00:25 (+2)
00:30 (+3)
因此,每天有效地采样7个值(当参数设置为3)而不是1。
如果它有帮助的话,我需要这样做来处理边值,但也需要为空,就像没有接收到实体的数据一样,周期根本不存在。
我正在使用ms sql server 2016;最好的方法是什么?有没有一个函数可以自动完成,或者我可能只是错过了一些非常简单的东西?

uinbv5nw

uinbv5nw1#

你可以用窗口函数来实现。逻辑是枚举每个实体的行以及每天的行 row_number() ,然后标识每个分区中时间与参数匹配的行的行号。然后可以使用该信息进行过滤。
假设表中的列 entity (实体), ts (datetime列)和 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)

这将为每个实体和每天提供一个记录,用于保存 stdevp() 7个目标记录的值。

相关问题