# 聚合函数
#### hll_add_agg(hll_hashval)
描述：把哈希后的数据按照分组放到hll中。
返回值类型：hll
示例：
1. 准备数据。
   ```
   CREATE TABLE t_id(id int);
   INSERT INTO t_id VALUES(generate_series(1,500));
   CREATE TABLE t_data(a int, c text);
   INSERT INTO t_data SELECT mod(id,2), id FROM t_id;
   ```
   
2. 创建表并指定列为hll。
   ```
   CREATE TABLE t_a_c_hll(a int, c hll);
   ```
   
3. 根据a列group by对数据分组，把各组数据加到hll中。
   ```
   INSERT INTO t_a_c_hll SELECT a, hll_add_agg(hll_hash_text(c)) FROM t_data GROUP BY a;
   ```
   
4. 得到每组数据中hll的Distinct值。
   ```
   SELECT a, #c as cardinality FROM t_a_c_hll order by a;
    a |   cardinality    
   ---+------------------
    0 | 250.741759091658
    1 | 250.741759091658
   (2 rows)
   ```
   
 
#### hll_add_agg(hll_hashval, int32 log2m)
描述：把哈希后的数据按照分组放到hll中。并指定参数log2m，取值范围为10\~16。
返回值类型：hll
示例：
```
SELECT hll_cardinality(hll_add_agg(hll_hash_text(c), 10)) FROM t_data;
 hll_cardinality  
------------------
 503.932348927339
(1 row)
```
#### hll_add_agg(hll_hashval, int32 log2m, int32 regwidth)
描述：把哈希后的数据按照分组放到hll中。依次指定参数log2m，regwidth。 regwidth取值范围为1\~5。
返回值类型：hll
示例：
```
SELECT hll_cardinality(hll_add_agg(hll_hash_text(c), NULL, 1)) FROM t_data;
 hll_cardinality  
------------------
 496.628982624022
(1 row)
```
#### hll_add_agg(hll_hashval, int32 log2m, int32 regwidth, int64 expthresh)
描述：把哈希后的数据按照分组放到hll中，依次指定参数log2m、regwidth、expthresh。expthresh的取值范围是-1\~7之间的整数，该参数可以用来设置从Explicit模式到Sparse模式的阈值大小。-1表示自动模式，0表示跳过Explicit模式，取1\~7表示在基数到达 2^expthresh^时切换模式。
返回值类型：hll
示例：
```
SELECT hll_cardinality(hll_add_agg(hll_hash_text(c), NULL, 1, 4)) FROM t_data;
 hll_cardinality  
------------------
 496.628982624022
(1 row)
```
#### hll_add_agg(hll_hashval, int32 log2m, int32 regwidth, int64 expthresh, int32 sparseon)
描述：把哈希后的数据按照分组放到hll中，依次指定参数log2m、regwidth、expthresh、sparseon。sparseon取值范围为0或者1。
返回值类型：hll
示例：
```
SELECT hll_cardinality(hll_add_agg(hll_hash_text(c), NULL, 1, 4, 0)) FROM t_data;
 hll_cardinality  
------------------
 496.628982624022
(1 row)
```
#### hll_union_agg(hll)
描述：将多个hll类型数据union成一个hll。
返回值类型：hll
示例：
将各组中的hll数据union成一个hll，并计算distinct值。
```
SELECT #hll_union_agg(c) as cardinality FROM t_a_c_hll;
   cardinality    
------------------
 496.628982624022
(1 row)
```
![](https://support.huaweicloud.com/sqlreference-911-dws/public_sys-resources/note_3.0-zh-cn.png)
当两个或者多个hll数据结构执行union时，必须要保证其中每一个hll里面的精度参数一样，否则不能进行union。同样的约束也适用于函数hll_union(hll,hll)。
