sql - SQL Server 中 MIN/MAX 的更快替代方案
问题描述
我需要过去 n 天的最低/最高股票价格。以下查询的工作速度非常慢。我将不胜感激更快的选择:
SELECT
*,
MIN(Close) OVER (PARTITION BY Ticker ORDER BY PriceDate ROWS BETWEEN 14 PRECEDING AND 1 PRECEDING) AS MinPrice14d,
MAX(Close) OVER (PARTITION BY Ticker ORDER BY PriceDate ROWS BETWEEN 14 PRECEDING AND 1 PRECEDING) AS MaxPrice14d
FROM
(SELECT CompanyID, Ticker, PriceDate, Close
FROM price.PriceHistoryDaily) a
- 我需要指定的列。
- 它是尾随的,所以我每天都需要它。
- 至于期限,我将其限制为一年。
解决方案
虽然不影响性能,但不需要子查询。所以从更简单的版本开始:
SELECT phd.CompanyID, phd.Ticker, phd.PriceDate, phd.Close,
min(Close) over (partition by Ticker
order by PriceDate
rows between 14 preceding and 1 preceding
) as MinPrice14d,
max(Close) over (partition by Ticker
order by PriceDate
rows between 14 preceding and 1 preceding
) as MaxPrice14d
FROM price.PriceHistoryDaily phd;
然后尝试添加索引: PriceHistoryDaily(Ticker, PriceDate)
。
注意:这将返回所有行,PriceHistoryDaily
并且 - 取决于表的大小 - 这可能是推动性能的原因。
推荐阅读
- r - 使用 igraph 可视化 Collatz Graph
- php - laravel:无法通过控制器中的函数存储从文本区域获取输入
- elasticsearch - 使用 Kibana 的 Fluentd 解析器类型
- python-3.x - 通过捕获组的正则表达式拆分火花数据框列中的字符串
- chart.js - chart.js:yAxis 之一在混合图表中未正确缩放
- python-3.x - 期货:从不同的线程设置结果
- javascript - 如何为特定位置创建滚动事件
- javascript - 检查是否正在使用数组中的一个元素,如果是,则使用另一个元素
- java - 存储为文本的错误值/数字 - Apache POI
- linux - 仅在“:”之后的 grep 文本