分组聚合函数
概述
所有分组聚合函数都接受一个输入序列和一个 group_by 序列参数,并生成一个结果序列,其中包含每个组的计算聚合值。对象的序列会根据 group_by 序列中的值进行分组,该序列应是有序的。
函数 | 说明 |
---|---|
seq_group_agg_count(input, group_by) | 返回一个序列,其中包含每个组中元素的数量 |
seq_group_agg_max(input, group_by) | 返回一个序列,其中包含每个组元素的最大值 |
seq_group_agg_min(input, group_by) | 返回一个序列,其中包含每个组元素的最小值 |
seq_group_agg_first(input, group_by) | 返回一个序列,其中包含每个组的第一个元素 |
seq_group_agg_last(input, group_by) | 返回一个序列,其中包含每个组的最后一个元素 |
seq_group_agg_sum(input, group_by) | 返回一个序列,其中包含每个组元素的总和 |
seq_group_agg_avg(input, group_by) | 返回一个序列,其中包含每个组元素的平均值 |
seq_group_agg_var(input, group_by) | 返回一个序列,其中包含每个组元素的方差 |
seq_group_agg_var_samp(input, group_by) | 返回一个序列,其中包含每个组元素的样本方差 |
seq_group_agg_dev(input, group_by) | 返回一个序列,其中包含每个组元素的标准差 |
seq_group_agg_approxdc( 按...分组 ) | 返回一个序列,其中包含每个组中不同值的近似计数 |
计数和近似直方图函数
seq_group_agg_count()
和 seq_group_agg_approxdc()
函数分别计算由 group_by
参数确定的各组中的元素数量以及不同值的大致数量。 以下是一个示例脚本,演示了 seq_group_agg_count()
和 seq_group_agg_approxdc()
函数的用法:
SELECT symbol,
seq_search(day, 20130101, 20130131) as Jan_13,
seq_group_agg_count(Jan_13/7) as "week_count",
seq_group_agg_approxdc(volume@Jan_13, Jan_13/7) as "week_approxdc"
FROM Quote WHERE symbol = 'SYM0';
symbol
Jan_13{}
week_count{}
week_approxdc{}
------------------------------------------------------------------------------
SYM0
{20130101, 20130104, 20130106, 20130110, 20130123, 20130125, 20130129}
{1, 2, 1, 1, 2}
{1, 2, 1, 1, 2}
正如在其他 Group_Agg 函数中所见,第 1 周、第 3 周和第 4 周各有一个元素,而第 2 周和第 5 周则有两个不同的元素,如上文结果所示。
要使用 xSQL 演示此选择语句,可从 samples/xsql/scripts/financial 目录中运行以下命令来执行示例脚本:
g 6
最大值和最小值函数
seq_group_agg_max() 和 seq_group_agg_min() 函数分别提取由 group_by 参数确定的各组中的最大值和最小值。 以下是一个示例脚本,演示了 seq_group_agg_max() 和 seq_group_agg_min() 函数:
SELECT symbol,
seq_search(day, 20130101, 20130131) as Jan_13,
seq_group_agg_max(volume@Jan_13, Jan_13/7) as "week_max",
seq_group_agg_min(volume@Jan_13, Jan_13/7) as "week_min"
FROM Quote WHERE symbol = 'SYM0';
symbol
Jan_13
week_max
week_min
------------------------------------------------------------------------------
SYM0
{20130101, 20130104, 20130106, 20130110, 20130123, 20130125, 20130129}
{335, 808, 402, 732, 805}
{335, 45, 402, 732, 48}
在上述示例中,布尔序列在位置 1 和 3 处的值为“true”。因此,输入值序列中相应位置的值 -13 和 -19 被复制到结果序列中。 以下表格说明了最大值和最小值如何对应于 5 个组(周):
Volume_Jan_13 | max | min | Week |
---|---|---|---|
335 | 335 | 335 | 1 |
808 | 808 | 2 | |
45 | 45 | 2 | |
402 | 402 | 402 | 3 |
732 | 732 | 732 | 4 |
48 | 48 | 5 | |
805 | 805 | 5 |
要使用 xSQL 演示此选择语句,可从 samples/xsql/scripts/financial 目录中运行以下命令来执行示例脚本:
g 6
首尾函数
seq_group_agg_first()
和 seq_group_agg_last()
函数分别提取由 group_by
参数确定的各组中的第一个和最后一个元素的值。以下是一个示例脚本,演示了 seq_group_agg_first() 和 seq_group_agg_last() 函数:
SELECT symbol,
seq_search(day, 20130101, 20130131) as Jan_13,
seq_group_agg_first(volume@Jan_13, Jan_13/7) as "week_first",
seq_group_agg_last(volume@Jan_13, Jan_13/7) as "week_last"
FROM Quote WHERE symbol = 'SYM0';
symbol
Jan_13{}
week_first{}
week_last{}
------------------------------------------------------------------------------
SYM0
{20130101, 20130104, 20130106, 20130110, 20130123, 20130125, 20130129}
{335, 808, 402, 732, 48}
{335, 45, 402, 732, 805}
下表说明了第一个和最后一个值如何对应于 5 个组(周):
Volume_Jan_13 | first | last | Week |
---|---|---|---|
335 | 335 | 335 | 1 |
808 | 808 | 2 | |
45 | 45 | 2 | |
402 | 402 | 402 | 3 |
732 | 732 | 732 | 4 |
48 | 48 | 5 | |
805 | 805 | 5 |
要使用 xSQL 演示此选择语句,可从 samples/xsql/scripts/financial 目录中运行以下命令来执行示例脚本:
g 6
求和与平均值函数
seq_group_agg_sum() 和 seq_group_agg_avg() 函数会根据 group_by 参数确定的分组来计算总和与平均值。 以下是一个示例脚本,演示了 seq_group_agg_sum() 和 seq_group_agg_avg() 函数:
SELECT symbol,
seq_search(day, 20130101, 20130131) as Jan_13,
seq_group_agg_sum(volume@Jan_13, Jan_13/7) as "week_sum",
seq_group_agg_avg(volume@Jan_13, Jan_13/7) as "week_avg"
FROM Quote WHERE symbol = 'SYM0';
symbol
Jan_13{}
week_sum{}
week_avg{}
------------------------------------------------------------------------------
SYM0
{20130101, 20130104, 20130106, 20130110, 20130123, 20130125, 20130129}
{335, 853, 402, 732, 853}
{335.000000, 426.500000, 402.000000, 732.000000, 426.500000}
下表说明了第一个和最后一个值如何对应于 5 个组(周):
Volume_Jan_13 | sum | avg | Week |
---|---|---|---|
335 | 335 | 335.000000 | 1 |
808 | 853 | 426.500000 | 2 |
45 | (=853/2) | 2 | |
402 | 402 | 402.000000 | 3 |
732 | 732 | 732.000000 | 4 |
48 | 853 | 426.500000 | 5 |
805 | (=853/2) | 5 |
要使用 xSQL 演示此选择语句,可从 samples/xsql/scripts/financial 目录中运行以下命令来执行示例脚本:
g 6
方差和标准差函数
seq_group_agg_var()
和 seq_group_agg_dev()
函数用于计算由 group_by
参数确定的各组的方差和标准差。 以下是一个示例脚本,演示了 seq_group_agg_var()
和 seq_group_agg_dev()
函数的用法:
SELECT symbol,
seq_search(day, 20130101, 20130131) as Jan_13,
seq_group_agg_var(volume@Jan_13, Jan_13/7) as "week_var",
seq_group_agg_dev(volume@Jan_13, Jan_13/7) as "week_dev"
FROM Quote WHERE symbol = 'SYM0';
symbol
Jan_13{}
week_var{}
week_dev{}
------------------------------------------------------------------------------
SYM0
{20130101, 20130104, 20130106, 20130110, 20130123, 20130125, 20130129}
{0.000000, 145542.250000, 0.000000, 0.000000, 143262.250000}
{0.000000, 381.500000, 0.000000, 0.000000, 378.500000}
下表说明了第一个和最后一个值如何对应于 5 个组(周):
Volume_Jan_13 | var | dev | Week |
---|---|---|---|
335 | 0.000000 | 0.000000 | 1 |
808 | 145542.250000 | 381.500000 | 2 |
45 | 2 | ||
402 | 0.000000 | 0.000000 | 3 |
732 | 0.000000 | 0.000000 | 4 |
48 | 143262.250000 | 378.500000 | 5 |
805 | 5 |
请注意,第 2 周和第 5 周的巨大方差和标准差值表明该周内两个交易日的成交量差异很大:
- 第 2 周:{808,45} -> 145542.25,381.5
- 第 5 周:{48805} -> 143262.25,378.5
要使用 xSQL 演示此选择语句,可从 samples/xsql/scripts/financial 目录中运行以下命令来执行示例脚本:
g 6
示例
正如“分析函数库示例”页面中所解释的那样,以下示例中的数据取自 2013 年 IBM 的历史值。通过在 samples/xsql/scripts/financial 目录中运行各种脚本将数据加载到 xSQL 中。要重现下面的示例,请运行 g.bat(在 Linux 系统上为 g.sh),并指定示例编号 6。例如,以 scripts/financial 作为当前工作目录,只需键入:
g 6
以下是一个示例代码片段,展示了 2013 年 1 月的一些 group_agg() 函数(请注意,group_by 参数是交易日期序列除以 7,以实现按 7 天间隔分组):
-- Show volumes for January 2013
SELECT symbol, seq_search(day, 20130101, 20130131) as Jan_13,
volume@Jan_13 as "Volume_Jan_13"
FROM Quote WHERE symbol = 'SYM0';
symbol
Jan_13{}
Volume_Jan_13{}
-------------------------------------------------------------------------
SYM0
{20130101, 20130104, 20130106, 20130110, 20130123, 20130125, 20130129}
{335, 808, 45, 402, 732, 48, 805}
-- _max, _min
SELECT symbol,
seq_search(day, 20130101, 20130131) as Jan_13,
seq_group_agg_max(volume@Jan_13, Jan_13/7) as "week_max",
seq_group_agg_min(volume@Jan_13, Jan_13/7) as "week_min"
FROM Quote WHERE symbol = 'SYM0';
symbol
Jan_13{}
week_max{}
week_min{}
-------------------------------------------------------------------------
SYM0
{20130101, 20130104, 20130106, 20130110, 20130123, 20130125, 20130129}
{335, 808, 402, 732, 805}
{335, 45, 402, 732, 48}
-- _first, _last
SELECT symbol,
seq_search(day, 20130101, 20130131) as Jan_13,
seq_group_agg_first(volume@Jan_13, Jan_13/7) as "week_first",
seq_group_agg_last(volume@Jan_13, Jan_13/7) as "week_last"
FROM Quote WHERE symbol = 'SYM0';
symbol
Jan_13{}
week_first{}
week_last{}
-------------------------------------------------------------------------
SYM0
{20130101, 20130104, 20130106, 20130110, 20130123, 20130125, 20130129}
{335, 808, 402, 732, 48}
{335, 45, 402, 732, 805}
-- _sum, _avg
SELECT symbol,
seq_search(day, 20130101, 20130131) as Jan_13,
seq_group_agg_sum(volume@Jan_13, Jan_13/7) as "week_sum",
seq_group_agg_avg(volume@Jan_13, Jan_13/7) as "week_avg"
FROM Quote WHERE symbol = 'SYM0';
symbol
Jan_13{}
week_sum{}
week_avg{}
-------------------------------------------------------------------------
SYM0
{20130101, 20130104, 20130106, 20130110, 20130123, 20130125, 20130129}
{335, 853, 402, 732, 853}
{335, 426.5, 402, 732, 426.5}
-- _var, _dev
SELECT symbol,
seq_search(day, 20130101, 20130131) as Jan_13,
seq_group_agg_var(volume@Jan_13, Jan_13/7) as "week_var",
seq_group_agg_dev(volume@Jan_13, Jan_13/7) as "week_dev"
FROM Quote WHERE symbol = 'SYM0';
symbol
Jan_13{}
week_var{}
week_dev{}
-------------------------------------------------------------------------
SYM0
{20130101, 20130104, 20130106, 20130110, 20130123, 20130125, 20130129}
{0, 145542.25, 0, 0, 143262.25}
{0, 381.5, 0, 0, 378.5}
-- _count, _approxdc
SELECT symbol,
seq_search(day, 20130101, 20130131) as Jan_13,
seq_group_agg_count(Jan_13/7) as "week_count",
seq_group_agg_approxdc(volume@Jan_13, Jan_13/7) as "week_approxdc"
FROM Quote WHERE symbol = 'SYM0';
symbol
Jan_13{}
week_count{}
week_approxdc{}
-------------------------------------------------------------------------
SYM0
{20130101, 20130104, 20130106, 20130110, 20130123, 20130125, 20130129}
{1, 2, 1, 1, 2}
{1, 2, 1, 1, 2}