在 T-SQL FAST 中计算前 1440 行的高低?

Posted

技术标签:

【中文标题】在 T-SQL FAST 中计算前 1440 行的高低?【英文标题】:Calculate in T-SQL FAST the high and low of the previous 1440 rows? 【发布时间】:2021-01-05 21:09:05 【问题描述】:

我每分钟都有一行,有高值和低值。我想为当前行计算前 1440 行(=1 天)的最高值以及同一时期的最低值。

数据模型非常简单。

TimeStamp           | High | Low
2020-01-01 01:01    |  10  |  8
2020-01-01 01:02    |  11  |  8
2020-01-01 01:03    |  11  |  6
...

这对于 10M 行

我试过了:

自行加入前 1440 行的 MIN 和 MAX 滥用延迟功能 创建游标逐行计算结果

所有都未能在 2 小时内运行...

所以我希望用另一种方法来激发创造力。

我最后的手段是 Python,我可以在其中将其作为矩阵导航。 然而,这应该是最后的手段。

【问题讨论】:

MAX/MIN() OVER... 不是LAG 确定吗?也可以在查询中的任何地方尝试这个技巧以获得批处理模式LEFT JOIN DummyColumnstoreTable ON 1 = 0 创建一个带有表结构、一小部分测试数据和一个返回预期结果的 sql 脚本的 sql fiddle 【参考方案1】:

我相信你正在寻找over w/rows/range

select
    ...
    , [TimeStamp]
    , [PrecedingDayHigh] = MAX([High]) 
        over( order by [TimeStamp] desc ROWS BETWEEN 1339 PRECEDING AND CURRENT ROW )
    , [PrecedingDayLow] = MIN([Low])
        over( order by [TimeStamp] desc ROWS BETWEEN 1339 PRECEDING AND CURRENT ROW )
from
    ...

【讨论】:

这是一个正确的答案。我忘记将这个也添加到我尝试过的方法中。不幸的是仍然很慢...... 时间戳列有索引吗?【参考方案2】:

嗯。 . .如果你想要high最高的那一行:

select top (1) t.*
from (select top (1440) t.*
      from t
      order by timestamp desc
     ) t
order by high desc;

你可以对最高点或最低点做类似的事情。

【讨论】:

看起来 OP 希望每一行都有一个滚动的最小值/最大值

以上是关于在 T-SQL FAST 中计算前 1440 行的高低?的主要内容,如果未能解决你的问题,请参考以下文章

P1886 滑动窗口&&P1440 求m区间内的最小值

带有子行的 T-SQL SELECT 存在优化

如何从 T-SQL 中的表中选择前 N 行?

Fast InvSqrt()(平方根倒数速算法)

如何从每组中获得前 1 行? (T-SQL)

t-sql中字符串前加N代表什么意思