GROUP BY 子句
在 GROUP BY
中将 SELECT
子句与聚合函数一起使用可以收集多个记录中的数据。Vertica 将结果分组成为一个或多个与表达式匹配的行集。
不包含聚合的 GROUP BY
子句的使用方式类似于 SELECT DISTINCT
。
ROLLUP
是对 GROUP BY
子句的扩展。 ROLLUP
执行小计聚合。
语法
GROUP BY [/*+GBYTYPE(algorithm)*/] { expression | aggregate‑expression }[,...]
参数
-
/*+GBYTYPE(algorithm)*/
- 指定实现
GROUP BY
子句时优先级高于 Vertica 查询优化器可能选择的算法的算法。可以将 algorithm 设置为以下值之一:-
HASH
:GROUPBY HASH
算法 -
PIPE
:GROUPBY PIPELINED
算法
有关两种算法的详细信息,请参阅 GROUP BY 实施选项。
-
- 表达式
- 任何表达式,包括 FROM 子句中指定的表中的常数和列引用。例如:
column,... column, (expression)
- aggregate‑expression
- 列、表达式、
CUBE, GROUPING SETS
或ROLLUP
聚合按顺序排列的列表。可以将
CUBE
和ROLLUP
聚合包括在一个GROUPING SETS
聚合内。CUBE
和ROLLUP
聚合可产生大量输出。在这种情况下,使用GROUPING SETS
仅返回某些结果。不能将任何聚合包含在
CUBE
或ROLLUP
表达式中。可以将多个
GROUPING SETS
、CUBE
或ROLLUP
聚合附加到同一个查询中。例如:GROUP BY a,b,c,d, ROLLUP(a,b) GROUP BY a,b,c,d, CUBE((a,b),c,d) GROUP BY a,b,c,d, CUBE(a,b), ROLLUP (c,d) GROUP BY ROLLUP(a), CUBE(b), GROUPING SETS(c) GROUP BY a,b,c,d, GROUPING SETS ((a,d),(b,c),CUBE(a,b)) GROUP BY a,b,c,d, GROUPING SETS ((a,d),(b,c),(a,b),(a),(b),())
用法注意事项
-
表达式不能包括聚合函数。但是,可以将 GROUP BY 子句与 CUBE、GROUPING SETS 和
ROLLUP
一起使用,以返回每个组的汇总值。 -
创建 GROUP BY 子句时,必须包括
SELECT
列表中显示的所有非聚合列。 -
如果
GROUP BY
子句包括WHERE
子句,Vertica 会忽略所有不满足WHERE
子句的行。
示例
此示例显示了如何将 WHERE
子句与 GROUP BY
一起使用。在这种情况下,示例检索姓氏以 S 开头的所有员工,忽略所有不符合此条件的行。GROUP BY
子句使用 ILIKE
函数仅检索以 S 开头的姓氏。聚合函数 SUM
计算每个组的总休假天数。
=> SELECT employee_last_name, SUM(vacation_days)
FROM employee_dimension
WHERE employee_last_name ILIKE 'S%'
GROUP BY employee_last_name;
employee_last_name | SUM
--------------------+------
Sanchez | 2892
Smith | 2672
Stein | 2660
(3 rows)
以下示例中的 GROUP BY
子句按供应商地区和供应商地区的最大交易对结果分组:
=> SELECT vendor_region, MAX(deal_size) AS "Biggest Deal"
FROM vendor_dimension
GROUP BY vendor_region;
vendor_region | Biggest Deal
---------------+--------------
East | 990889
MidWest | 699163
NorthWest | 76101
South | 854136
SouthWest | 609807
West | 964005
(6 rows)
以下查询使用 HAVING
子句修改上一个查询,该子句指定仅返回最大交易规模超过 $900,000 的组:
=> SELECT vendor_region, MAX(deal_size) as "Biggest Deal"
FROM vendor_dimension
GROUP BY vendor_region
HAVING MAX(deal_size) > 900000;
vendor_region | Biggest Deal
---------------+--------------
East | 990889
West | 964005
(2 rows)
可以将 GROUP BY
子句与标量类型的一维数组一起使用。在以下示例中,grants 为 ARRAY[VARCHAR],grant_values 为 ARRAY[INT]。
=> CREATE TABLE employees (id INT, department VARCHAR(50), grants ARRAY[VARCHAR], grant_values ARRAY[INT]);
=> COPY employees FROM STDIN;
42|Physics|[US-7376,DARPA-1567]|[65000,135000]
36|Physics|[US-7376,DARPA-1567]|[10000,25000]
33|Physics|[US-7376]|[30000]
36|Astronomy|[US-7376,DARPA-1567]|[5000,4000]
\.
=> SELECT department, grants, SUM(apply_sum(grant_values)) FROM employees GROUP BY grants, department;
department | grants | SUM
------------+--------------------------+--------
Physics | ["US-7376","DARPA-1567"] | 235000
Astronomy | ["US-7376","DARPA-1567"] | 9000
Physics | ["US-7376"] | 30000
(3 rows)
不包含聚合的 GROUP BY
子句的使用方式类似于 SELECT DISTINCT
。例如,以下两个查询返回相同的结果:
=> SELECT DISTINCT household_id FROM customer_dimension;
=> SELECT household_id FROM customer_dimension GROUP BY household_id;