SQL Group By分组的使用

本文详细介绍了分组计算函数的基本概念及其应用场景,包括求最大值、最小值、平均值等常用函数,并通过具体实例展示了如何在SQL查询中使用这些函数进行数据分析。

分组计算函数:相对于单行函数,也可称之为多行函数,它的输入是多个行构成得一个行集(这个行集可以是一 张表的所有行,也可以是按照某个维度进行分组后的某一组行),而输出都是一个值;
比如我们常见的一些分组计算需求:求某个部门的薪资总和,薪资平均值,薪资最大值等等。
分组函数一般包括:

max(最大值),min(最小值),avg(平均值),count(统计数量),sum(求和),stddev(标准差),variance(方差)

函数作用函数作用
max最大值min最小值
sum求和count统计数量
stddev标准差variance方差
avg平均值

备注:min,max可用于任何数据类型,但avg,sum,stddev,variance 仅适用于数值型字段。count(expr)不可统计空行,但是count(*)可以统计所有的行。

1、当分组计算函数与一些普通的字段名,如部门号(department_id)都要被选择时,就需要使用到group by函数,而且对于每个普通字段都要用group by进行分组,不然执行时会报错(ORA-00979:不是GROUP BY表达式)。

2、当需要用到条件限定(where)时,要把group by放在条件限定的后面去,不然会提示SQL命令未正确结束。

3、当使用的条件限定中需要用到分组计算函数时,要使用HAVING字段进行,不能使用WHERE。

SELECT department_id,
       job_id,
       AVG(salary)
  FROM employees
 WHERE department_id > 50
 GROUP BY department_id,
          job_id
HAVING AVG(salary) > 8000;
<think>我们正在讨论FlinkSQL中的GROUPBY分组用法。根据提供的引用,我们可以总结以下几点:1.引用[1]提到:GROUPBY将需要分组的字段放在groupby子句即可,把时间字段放在groupby下可实现开窗的功能。示例:`SELECTCOUNT(*)FROMOrdersGROUPBYorder_id`。2.引用[2]介绍了GROUPINGSETS:它允许在一个GROUPBY查询中根据不同的维度组合进行聚合,相当于多个GROUPBY逻辑的UNION。示例中展示了三种分组组合:(supplier_id,rating),(supplier_id),()(空分组集表示所有行聚合到一个组)。结果中,没有参与分组的列会显示为NULL。3.引用[3]提到了FlinkSQLGROUPBY使用需要引入相关的依赖。用户的问题:想了解FlinkSQLGROUPBY分组使用方法,要求详解。因此,我们需要详细解释GROUPBY的基本用法以及高级用法(如GROUPINGSETS)。同时,由于FlinkSQL是流处理,我们还需要注意与批处理中GROUPBY的一些区别,比如状态管理和时间属性。回答结构:1.介绍GROUPBY的基本用法。2.说明在流处理中使用GROUPBY的注意事项(如时间窗口、状态大小)。3.介绍GROUPBY的高级用法:GROUPINGSETS、ROLLUP、CUBE。4.给出一些示例。5.生成相关问题。注意:按照要求,行内数学表达式用$...$,独立公式用$$...$$(但这里可能数学公式不多,主要是SQL代码)。另外,使用中文回答,并在引用的地方添加引用标识。由于引用中并没有提到ROLLUP和CUBE,但它们是GROUPBY的高级特性,我们可以简要提及(但注意引用中只有GROUPINGSETS的示例)。同时,引用[1]提到时间字段放在groupby下可实现开窗,这里需要解释:在FlinkSQL中,如果groupby中包含时间属性字段,那么就会按照时间窗口进行分组,但注意这并不是显式的窗口函数(如TUMBLE)的方式,而是基于事件时间或处理时间的属性分组。另外,引用[2]中的示例展示了GROUPINGSETS的用法,我们可以详细解释。下面开始组织回答:</think>### Flink SQL GROUP BY 分组用法详解 #### 一、基本分组聚合 在 Flink SQL 中,`GROUP BY` 用于对数据进行分组聚合,语法与标准 SQL 一致。将需要分组的字段放入 `GROUP BY` 子句,结合聚合函数(如 `COUNT`, `SUM`, `AVG`)进行计算: ```sql SELECT order_id, COUNT(*) AS order_count FROM Orders GROUP BY order_id; ``` 当分组字段包含时间属性时,可实现隐式窗口聚合: ```sql SELECT user_id, TUMBLE_END(event_time, INTERVAL '1' HOUR) AS window_end, SUM(amount) FROM Orders GROUP BY user_id, TUMBLE(event_time, INTERVAL '1' HOUR); ``` #### 二、多维聚合扩展 Flink 支持通过 `GROUPING SETS`、`ROLLUP`、`CUBE` 实现多维度聚合: 1. **GROUPING SETS** 同时按多个维度组合分组,未参与分组的字段显示为 `NULL`: ```sql SELECT supplier_id, rating, COUNT(*) AS total FROM Products GROUP BY GROUPING SETS ((supplier_id, rating), (supplier_id), ()); ``` 结果示例(引用[2]): ``` +-------------+--------+-------+ | supplier_id | rating | total | +-------------+--------+-------+ | supplier1 | 4 | 1 | | supplier1 | 3 | 1 | | supplier2 | 3 | 1 | | supplier2 | 4 | 1 | | supplier1 | NULL | 2 | -- 仅按supplier_id聚合 | supplier2 | NULL | 2 | | NULL | NULL | 4 | -- 全局聚合 +-------------+--------+-------+ ``` 2. **ROLLUP** 生成层次化聚合(如 地区+城市 → 地区 → 全局): ```sql SELECT region, city, SUM(sales) FROM Sales GROUP BY ROLLUP (region, city); ``` 3. **CUBE** 生成所有维度组合的聚合: ```sql SELECT department, gender, AVG(salary) FROM Employees GROUP BY CUBE (department, gender); ``` #### 三、流处理注意事项 1. **状态管理** 分组字段的基数(Cardinality)过高可能导致状态膨胀,需合理设置状态 TTL(引用[2])。 2. **时间属性** 流处理中分组字段必须包含时间属性(如事件时间),否则需显式定义窗口: ```sql -- 错误:缺失时间属性 SELECT user, COUNT(*) FROM clicks GROUP BY user; -- 正确:添加时间窗口 SELECT user, COUNT(*) FROM clicks GROUP BY user, TUMBLE(proc_time, INTERVAL '5' MINUTE); ``` #### 四、依赖配置 使用高级分组功能需引入 Flink Table Planner 依赖(引用[3]): ```xml <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-table-planner-blink_${scala.version}</artifactId> <version>${flink.version}</version> </dependency> ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值