【发布时间】:2020-12-16 12:14:56
【问题描述】:
我想在几个不同长度的窗口上编写一个带有聚合函数的分析函数。假设我有一张股票收盘价表,如下所示:
Ticker | TradeDate | ClosePrice |
----------------------------------------
A1 20201209 1.1
A1 20201208 1.2
A1 20201207 1.6
.......
A1 20191209 1.1
A1 20191208 1.2
A1 20191207 1.6
A2 20201209 2.1
A2 20201208 2.2
A2 20201207 2.6
.......
A2 20191209 2.1
A2 20191208 2.2
A2 20191207 2.6
而现在我想得到这样的结果(返回的行数和原表一样):
Ticker | TradeDate | ClosePrice | Past3DaysAverage | Past1MonthAverage | Past1YearAverage
所以前三列与原始表相同。第四列,我作为参考,表示过去 3 个交易日的平均价格,直到同一股票的 TradeDate(因此有一个partition by 子句)。到目前为止,我可以编写如下查询:
select
t.Ticker, t.TradeDate, t.ClosePrice,
avg(t.ClosePrice) over (partition by t.Ticker order by TradeDate rows between 2 preceding and current row) as Past3DaysAverage
from PriceTable t
最后两列计算同一代码在过去 1 个月和 1 年直到 TradeDate 的平均价格。现在它很麻烦,因为我不知道如何指定不同的窗口长度(如果可能的话),因为直到不同日期的一年(或一个月)的交易日数不同,所以我不能使用类似的例程的ROWS(或RANGE)。谁能帮我解决这个问题?
非常感谢!
【问题讨论】:
标签: sql sql-server datetime date-arithmetic analytic-functions