在 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 行的高低?的主要内容,如果未能解决你的问题,请参考以下文章