
# GROUP WINDOW
#### 语法说明
Group Window定义在GROUP BY里，每个分组只输出一条记录，包括以下几种：
- 分组函数
  ![](https://support.huaweicloud.com/sqlref-flink-dli/public_sys-resources/caution_3.0-zh-cn.png)
  在流处理表中的 SQL 查询中，分组窗口函数的 time_attr 参数必须引用一个合法的时间属性，且该属性需要指定行的处理时间或事件时间。
  - time_attr设置为event-time时参数类型为timestamp(3)类型。
  
  - time_attr设置为processing-time时无需指定类型。
  
  
  对于批处理的 SQL 查询，分组窗口函数的 time_attr 参数必须是一个timestamp类型的属性。
  表1分组函数表 
  | 分组窗口函数                             | 说明                                                                                                                                                                                                                                                                                                                                    |
  |:---|:---|
  | TUMBLE(time_attr, interval)        | 定义一个滚动窗口。 滚动窗口把行分配到有固定持续时间（ interval ）的不重叠的连续窗口。 例如，5 分钟的滚动窗口以 5 分钟为间隔对行进行分组。 滚动窗口可以定义在事件时间（批处理、流处理）或处理时间（流处理）上。                                                                                                                            |
  | HOP(time_attr, interval, interval) | 定义一个跳跃的时间窗口（在 Table API 中称为滑动窗口）。 滑动窗口有一个固定的持续时间（ 第二个 interval 参数 ）以及一个滑动的间隔（第一个 interval 参数 ）。 如果滑动间隔小于窗口的持续时间，滑动窗口则会出现重叠；因此，行将会被分配到多个窗口中。 例如，一个大小为 15 分钟的滑动窗口，其滑动间隔为 5 分钟，将会把每一行数据分配到 3 个 15 分钟的窗口中。滑动窗口可以定义在事件时间（批处理、流处理）或处理时间（流处理）上。 |
  | SESSION(time_attr, interval)       | 定义一个会话时间窗口。 会话时间窗口没有一个固定的持续时间，但是它们的边界会根据 interval 所定义的不活跃时间所确定；即一个会话时间窗口在定义的间隔时间内没有事件出现，该窗口会被关闭。 例如时间窗口的间隔时间是 30 分钟，当其不活跃的时间达到30分钟后，如果观测到新的记录，则会启动一个新的会话时间窗口（否则该行数据会被添加到当前的窗口），且如果在 30 分钟内没有观测到新记录，这个窗口将会被关闭。会话时间窗口可以使用事件时间（批处理、流处理）或处理时间（流处理）。                           |
     
  
- 窗口辅助函数
  可以使用以下辅助函数选择组窗口的开始和结束时间戳以及时间属性。
  ![](https://support.huaweicloud.com/sqlref-flink-dli/public_sys-resources/caution_3.0-zh-cn.png)
  辅助函数必须使用与GROUP BY 子句中的分组窗口函数完全相同的参数来调用。
  表2窗口辅助函数表 
  | 辅助函数                                                                                                                                                                               | 说明                                                                                                                               |
  |:---|:---|
  | TUMBLE_START(time_attr, interval) HOP_START(time_attr, interval, interval) SESSION_START(time_attr, interval)        | 返回相对应的滚动、滑动和会话窗口范围内的下界时间戳。                                                                                                       |
  | TUMBLE_END(time_attr, interval) HOP_END(time_attr, interval, interval) SESSION_END(time_attr, interval)               | 返回相对应的滚动、滑动和会话窗口*范围以外*的上界时间戳。 范围以外的上界时间戳不可以 在随后基于时间的操作中，作为行时间属性使用，比如基于时间窗口的join以及分组窗口或分组窗口上的聚合。 |
  | TUMBLE_ROWTIME(time_attr, interval) HOP_ROWTIME(time_attr, interval, interval) SESSION_ROWTIME(time_attr, interval) | 返回的是一个可用于后续需要基于时间的操作的时间属性（rowtime attribute），比如基于时间窗口的join以及 分组窗口或分组窗口上的聚合。                                                      |
  | TUMBLE_PROCTIME(time_attr, interval) HOP_PROCTIME(time_attr, interval, interval) SESSION_PROCTIME(time_attr, interval) | 返回一个可用于后续需要基于时间的操作的 处理时间参数，比如基于时间窗口的join以及分组窗口或分组窗口上的聚合.                                                                         |
     
  
 
#### 示例
本例介绍GROUP WINDOW函数应用示例
```
// 每天计算SUM（金额）（事件时间）。
insert into temp SELECT name,
    TUMBLE_START(ts, INTERVAL '1' DAY) as wStart,
    SUM(amount)
    FROM Orders
    GROUP BY TUMBLE(ts, INTERVAL '1' DAY), name;
// 每天计算SUM（金额）（处理时间）。
insert into temp SELECT name, 
    SUM(amount) 
    FROM Orders 
    GROUP BY TUMBLE(proctime, INTERVAL '1' DAY), name;
// 每个小时计算事件时间中最近24小时的SUM（数量）。
insert into temp SELECT product, 
    SUM(amount) 
    FROM Orders 
    GROUP BY HOP(ts, INTERVAL '1' HOUR, INTERVAL '1' DAY), product;
// 计算每个会话的SUM（数量），间隔12小时的不活动间隙（事件时间）。
insert into temp SELECT name, 
    SESSION_START(ts, INTERVAL '12' HOUR) AS sStart,
    SESSION_END(ts, INTERVAL '12' HOUR) AS sEnd,
    SUM(amount)
    FROM Orders
    GROUP BY SESSION(ts, INTERVAL '12' HOUR), name;
```
