示例:哈希聚合平均值
计算 2013 年 3 月前两周按每日百万笔交易量分组的交易组的平均收盘价:
SELECT symbol,
seq_search(day, 20130304, 20130315) as Mar_2013,
volume@Mar_2013 as "volume", close@Mar_2013 as "close",
seq_hash_agg_avg(close@Mar_2013, volume@Mar_2013/1000000) as avg_vol,
seq_hash_group_by(avg_vol) as "group_by"
FROM Quote WHERE symbol='IBM';
symbol
Mar_2013{}
volume{}
close{}
avg_vol{}
group_by{}
------------------------------------------------------------------------------
IBM
{20130304, 20130305, 20130306, 20130307, 20130308,
20130311, 20130312, 20130313, 20130314, 20130315}
{3693365, 3807706, 3594899, 3884317, 3700786,
3049701, 3592096, 3356946, 5505584, 7936544}
{205.190002, 206.529999, 208.380005, 209.419998, 210.380005,
210.080002, 210.550003, 212.059998, 215.800003, 214.919998}
{214.919998, 209.073751, 215.800003}
{7, 3, 5}
请注意,“hash_aggregate”函数使用哈希表为由任意序列(不一定已排序,例如上述的 close)确定的每个组计算聚合值。因此,要解释这些函数的结果集,需要一个“group_by”序列。函数 seq_hash_group_by 返回用于分组的值序列,以便在结果序列中的值与组之间建立对应关系。
在上述示例中,收盘价被划分成与成交量值相关的组,成交量的范围分别为(0 - 999,999)、(1,000,000 - 1,999,999)、(2,000,000 - 2,999,999)等等。为了说明这一点,我们对输出结果进行如下分析:
我们在输出结果中突出显示了与分组序列中值为 3 的第二个元素相对应的值(输出结果中的最后一个序列)。
结果序列 avg_vol 中对应的值为(209.073751)。
要了解其计算方式,我们突出显示了交易量在 300 万至 400 万之间的成交量序列中的元素(成交量/1000000 = 3)。这些值的位置索引为(0、1、2、3、4、5、6)。
对元素 0 至 6 的收盘价进行平均计算如下:
(205.190002 + 206.529999 + 208.380005 + 209.419998 + 210.380005 + 210.080002 + 210.550003 + 212.059998)/ 8 = 209.073751
还请注意,在 500 万范围内的唯一一次成交量对应的是唯一的平均成交量值 215.800003,而在 700 万范围内的唯一一次成交量对应的是唯一的平均成交量值 214.919998。
要使用 xSQL 演示此选择语句,可以从 samples/xsql/scripts/financial 目录中运行以下命令来执行示例脚本:
x 11