哈希聚合分组 C 函数
哈希聚合 C API 函数基于哈希函数对聚合进行分组。因此,与 mco_seq_group_agg_TYPE()
API 不同,这些函数不要求分组序列是有序的。
与所有其他序列函数不同,这组函数为哈希表分配动态内存。如果 n_groups
参数为 0,则使用内部数据库运行时参数 mco_seq_hash_init_size
指定哈希表的大小,并在达到由 mco_seq_hash_load_factor
确定的阈值时自动扩展。此动态哈希表内存应通过调用 mco_seq_free_hash()
显式释放。
所有哈希聚合函数的结果都返回在 result_agg
或 result_count
序列中,作为每个组的计算聚合值或计数。输入序列根据 group_by
序列拆分为组。参数 result_group_by
返回用于分组的值序列,以便应用程序在结果序列中的值与组之间建立对应关系。
例如,考虑以下代码片段,它演示了如何使用哈希聚合函数来计算成交量值在 0..9、10..19、20..29 等区间内的收盘价平均值:
{
mco_trans_h trans;
mco_cursor_t quote_cursor;
Quote quote;
mco_seq_iterator_t close_iterator, volume_iterator, volume_div_10_iterator;
mco_seq_iterator_t group_iterator, avg_iterator;
MCO_RET rc;
...
for (rc = mco_cursor_first(trans, "e_cursor);
rc != MCO_S_CURSOR_END;
rc = mco_cursor_next(trans, "e_cursor))
{
Quote_from_cursor(trans, "e_cursor, "e);
Quote_close_iterator("e, &close_iterator);
Quote_volume_iterator("e, &volume_iterator);
rc = mco_seq_const_uint4(&const_iterator, 10);
rc = mco_seq_div_uint4(&volume_div_10_iterator, &volume_iterator, &const_iterator);
rc = mco_seq_hash_agg_avg_float(&avg_iterator, &group_iterator,
&close_iterator, &volume_div_10_iterator, 0);
...
mco_seq_free_hash(&avg_iterator);
}
...
}
假设我们有以下十三个值的成交量和收盘价序列:
Volume: {335, 808, 45, 402, 732, 48, 805, 450, 385, 420, 367, 69, 77}
Close: {62.830, 45.790, 74.730, 53.460, 67.870, 50.370, 80.320,
29.940, 25.920, 37.280, 80.920, 57.730, 43.850}
为了将 Volume
序列按照 0..9、10..19、20..29 等范围分组,我们创建了一个值为 10 的常量序列迭代器,并将其作为输入传递给 mco_seq_div_uint4()
API。这将生成以下序列值,这些值将返回到 result_group_by 序列(在此示例中为 group_iterator
)中:
{80, 73, 7, 38, 4, 40, 6, 45, 33, 42, 36}
请注意,这些值并不对应输入序列的位置。实际上,突出显示的值 80 是 Volume
序列中第二和第七个元素相除的结果。因此,落在 800 - 810 范围内的 Volume
值(即 808 和 805)属于第一组。
对于此输入,由函数 mco_seq_hash_agg_avg_float()
返回的结果聚合序列(在此示例中为 avg_iterator
)中的平均收盘价序列将具有以下值:
{63.055, 67.870, 43.850, 25.920, 62.550, 53.460, 57.730, 29.940, 62.830, 37.280, 80.920}
要将结果平均值中的值与相应的平均收盘价值组关联起来并验证计算,请注意以下几点:
结果分组序列 result_group_by 的第一个元素(80)对应于成交量在 800 - 810 范围内(其中成交量 / 10 = 80);
成交量在 800 - 810 范围内的值在位置 1(基于零的索引)处的元素为 808,在位置 6 处为 805;
对应元素 1 和 6 中的收盘价值分别为 45.790 和 80.320;
平均值为(45.790 + 80.320)/ 2 = 63.055,这是结果序列中位置 1 的值。
哈希聚合分组 SQL 函数
SQL API 提供了函数 seq_hash_group_by()
以生成用作 seq_hash_agg_*()
函数输入的分组值迭代器。