第46.1节 中心移动平均
计算价格6个月(126个工作日)中心移动平均:
sql
SELECT
TradeDate,
AVG(Px) OVER (
ORDER BY TradeDate
ROWS BETWEEN 63 PRECEDING AND 63 FOLLOWING
) AS PxMovingAverage
FROM HistoricalPrices;
- 由于每行需取前后最多63行,在开始与结束处无法完全居中。
第46.2节 查找时间戳列表中最新的一条记录
在记录事件的表中,常需找出最新一条事件。因时间戳可能重复,使用 row_number() over (order by ...) 保证唯一排序,再取 rn = 1:
sql
SELECT *
FROM (
SELECT *,
row_number() OVER (ORDER BY crdate DESC) AS my_ranking
FROM sys.sysobjects
) g
WHERE my_ranking = 1;
- 同样方法可用于任何可能出现重复排序列的数据集。
第46.3节 最近30条记录的移动平均
计算最近30条销售记录的移动平均:
sql
SELECT
value_column1,
(
SELECT AVG(value_column1) AS moving_average
FROM Table1 T2
WHERE (
SELECT COUNT(*)
FROM Table1 T3
WHERE date_column1 BETWEEN T2.date_column1 AND T1.date_column1
) BETWEEN 1 AND 30
) AS MovingAvg
FROM Table1 T1;
- 子查询按日期顺序统计行号,仅保留最近30行计算平均。