示例:窗口聚合
计算 2013 年 3 月的 5 日移动平均收盘价:
SELECT symbol,
seq_search(day, 20130225, 20130331) as Mar_2013,
close@Mar_2013 as "close",
seq_window_agg_avg(close@Mar_2013, 5) as "5-day-average"
FROM Quote WHERE symbol='IBM';
symbol
Mar_2013{}
close{}
5-day-average{}
------------------------------------------------------------------------------
IBM
{20130225, 20130226, 20130227, 20130228,
20130301, 20130304, 20130305, 20130306, 20130307,
20130308, 20130311, 20130312, 20130313, 20130314,
20130315, 20130318, 20130319, 20130320, 20130321,
20130322, 20130325, 20130326, 20130327, 20130328}
{197.509995, 199.139999, 202.330002, 200.830002,
202.910004, 205.190002, 206.529999, 208.380005, 209.419998,
210.380005, 210.080002, 210.550003, 212.059998, 215.800003,
214.919998, 213.210007, 213.440002, 215.059998, 212.259995,
212.080002, 210.740005, 212.360001, 210.889999, 213.300003}
{39.501999, 79.329999, 119.795999, 159.962000,
200.544000, 202.080002, 203.558002, 204.768002, 206.486002,
207.980002, 208.958002, 209.762003, 210.498001, 211.774002,
212.682001, 213.308002, 213.886002, 214.486002, 213.778000,
213.210001, 212.716000, 212.500000, 211.666000, 211.874002}
请注意,前 4 个平均值无效,因为没有 5 个值来求平均值,所以以下计算得出的并非真正的 5 日平均值:
197.509995 / 5 = 39.501999
(197.509995 + 199.139999) / 5 = 79.329999
(197.509995 + 199.139999 + 202.330002) / 5 = 119.795999
(197.509995 + 199.139999 + 202.330002 + 200.830002) / 5 = 159.962000
(有关“不完整区间”的解释,请参阅“窗口与网格聚合函数”页面。)
这就是为什么我们将日期范围定义为 20130225 至 20130331,以便舍弃 2 月的最后 4 天。然而,3 月 1 日及之后所有 3 月的日期的 5 日平均值都是有效的。例如,我们可以验证截至 3 月 14 日交易日的 5 个值计算平均值如下:
20130314 日期在 Mar_2013 序列中是第 14 个元素。
构成 5 日窗口的五个收盘价(突出显示)是 3 月 14 日之前和包括 3 月 14 日的五个交易日:20130308、20130311、20130312、20130313 和 20130314。
与 3 月 14 日(第 14 个元素)相对应的 5 日平均值序列(突出显示)值则按如下方式计算:
(210.380005 + 210.080002 + 210.550003 + 212.059998 + 215.800003) / 5 = 211.774002
要使用 xSQL 演示此选择语句,可以从 samples/xsql/scripts/financial 目录中运行以下命令来执行示例脚本:
x 8