Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL函数,用于查看近间隔的数据_Sql_Sql Server_Date_Window Functions_Gaps And Islands - Fatal编程技术网

SQL函数,用于查看近间隔的数据

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 我已经有了几个聚合函数来查看时间范围内的整个数据系列,我给它提

我试图确定是否存在某种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
我已经有了几个聚合函数来查看时间范围内的整个数据系列,我给它提供了一个参数,告诉它我想查看的是一天中的什么时间,作为一个参数(声明为datetime),通过连接事实。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;实现这一点的最佳方法是什么?是否有一个函数可以自动执行此操作,或者我可能只是缺少一些非常简单的功能?

    您可以使用窗口函数执行此操作。逻辑是使用
    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)之间的
    ,在最深的查询中,它与我非常接近,但我认为这个整体解决方案更容易实现其他一些功能。