【问题标题】:SQL Function to Look at near-by Intervals of data用于查看附近数据间隔的 SQL 函数
【发布时间】:2020-06-05 20:50:14
【问题描述】:

我正在尝试确定是否有某种 SQL 函数可以让我查看附近的数据间隔以将它们聚合到其他聚合函数中。

我当前的数据如下所示,每 5 分钟出现一次,在每个实体的给定时间段内每天输入一次。

  • EntityA 20200201 00:10:00 21.0
  • EntityA 20200201 00:15:00 23.0
  • EntityA 20200201 00:20:00 23.0
  • ...
  • EntityA 20200202 00:15:00 22.1
  • ...
  • EntityA 20200203 00:15:00 13.3

我已经有几个聚合函数正在查看时间范围内的整个数据系列,我向它提供了一个参数来告诉它我想将一天中的什么时间简单地视为“00:15”作为参数(声明作为日期时间),通过加入 Facts.Timekey = 4 即“00:15”作为一天中的第 4 个 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 左右的时间范围内。

如果参数是通过 00:15 并说我有另一个参数设置为 3,那么它会得到系列中每一天的事实值。实际值。不仅仅是执行聚合函数的单个值如 STDDEVP、AVERAGE、MAX、MIN、Median、Mode 等。

  1. 00:00 (-3)
  2. 00:05 (-2)
  3. 00:10 (-1)
  4. 00:15 (0)
  5. 00:20 (+1)
  6. 00:25 (+2)
  7. 00:30 (+3)

每天采样 7 个值(当参数设置为 3 时)与仅 1 值相比非常有效。

如果有帮助的话,我需要这样做来处理边缘值以及 NULL,就好像没有收到实体的数据一样,周期根本不存在。

我正在使用 MS SQL Server 2016;解决此问题的最佳方法是什么?是否有一个功能可以自动执行此操作,或者我可能只是错过了一些非常简单的东西?

【问题讨论】:

  • 你研究过窗口函数吗?

标签: sql sql-server date window-functions gaps-and-islands


【解决方案1】:

您可以使用窗口函数来做到这一点。逻辑是用row_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 出现在查询的外边缘,因为在最深的查询中作为 between DATEADD(second,-@TempOffSecs, @TimeFrame) and DATEADD(second, @TempOffSecs, @TimeFrame) 让我非常接近,但认为这个整体解决方案更容易也促进其他一些功能。
猜你喜欢
  • 1970-01-01
  • 2018-07-30
  • 2020-10-31
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 2017-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多