SQL 服务器中 MIN/MAX 的更快替代方案
Faster alternative of MIN/MAX in SQL Server
我需要 lowest/highest 过去 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)
.
注意:这 returns 所有 行来自 PriceHistoryDaily
并且 - 根据 table 的大小 - 这可能成为推动绩效的因素。
我需要 lowest/highest 过去 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)
.
注意:这 returns 所有 行来自 PriceHistoryDaily
并且 - 根据 table 的大小 - 这可能成为推动绩效的因素。