Files
streamsql/docs/FUNCTIONS_USAGE_GUIDE.md
T

337 lines
10 KiB
Markdown

# StreamSQL 函数使用指南
StreamSQL 具有丰富的内置函数,可以对数据执行各种计算。所有函数都支持在流式处理环境中使用,部分函数支持增量计算以提高性能。
## 📊 聚合函数
聚合函数对一组值执行计算并返回单个值。聚合函数只能用在以下表达式中:
- SELECT 语句的 SELECT 列表(子查询或外部查询)
- HAVING 子句
### SUM - 求和函数
**语法**: `sum(col)`
**描述**: 返回组中数值的总和。空值不参与计算。
**增量计算**: ✅ 支持
**示例**:
```sql
SELECT device, sum(temperature) as total_temp
FROM stream
GROUP BY device, TumblingWindow('10s')
```
### AVG - 平均值函数
**语法**: `avg(col)`
**描述**: 返回组中数值的平均值。空值不参与计算。
**增量计算**: ✅ 支持
**示例**:
```sql
SELECT device, avg(temperature) as avg_temp
FROM stream
GROUP BY device, TumblingWindow('10s')
```
### COUNT - 计数函数
**语法**: `count(*)`
**描述**: 返回组中的行数。
**增量计算**: ✅ 支持
**示例**:
```sql
SELECT device, count(*) as record_count
FROM stream
GROUP BY device, TumblingWindow('10s')
```
### MIN - 最小值函数
**语法**: `min(col)`
**描述**: 返回组中数值的最小值。空值不参与计算。
**增量计算**: ✅ 支持
**示例**:
```sql
SELECT device, min(temperature) as min_temp
FROM stream
GROUP BY device, TumblingWindow('10s')
```
### MAX - 最大值函数
**语法**: `max(col)`
**描述**: 返回组中数值的最大值。空值不参与计算。
**增量计算**: ✅ 支持
**示例**:
```sql
SELECT device, max(temperature) as max_temp
FROM stream
GROUP BY device, TumblingWindow('10s')
```
### COLLECT - 收集函数
**语法**: `collect(col)`
**描述**: 获取当前窗口所有消息的列值组成的数组。
**增量计算**: ✅ 支持
**示例**:
```sql
SELECT device, collect(temperature) as temp_values
FROM stream
GROUP BY device, TumblingWindow('10s')
```
### LAST_VALUE - 最后值函数
**语法**: `last_value(col)`
**描述**: 返回组中最后一行的值。
**增量计算**: ✅ 支持
**示例**:
```sql
SELECT device, last_value(temperature) as last_temp
FROM stream
GROUP BY device, TumblingWindow('10s')
```
### MERGE_AGG - 合并聚合函数
**语法**: `merge_agg(col)`
**描述**: 将组中的值合并为单个值。对于对象类型,合并所有键值对;对于其他类型,用逗号连接。
**增量计算**: ✅ 支持
**示例**:
```sql
SELECT device, merge_agg(status) as all_status
FROM stream
GROUP BY device, TumblingWindow('10s')
```
### DEDUPLICATE - 去重函数
**语法**: `deduplicate(col, false)`
**描述**: 返回当前组去重的结果,通常用在窗口中。第二个参数指定是否返回全部结果。
**增量计算**: ✅ 支持
**示例**:
```sql
SELECT device, deduplicate(temperature, true) as unique_temps
FROM stream
GROUP BY device, TumblingWindow('10s')
```
### STDDEV - 标准差函数
**语法**: `stddev(col)`
**描述**: 返回组中所有值的总体标准差。空值不参与计算。
**增量计算**: ✅ 支持(使用韦尔福德算法优化)
**示例**:
```sql
SELECT device, stddev(temperature) as temp_stddev
FROM stream
GROUP BY device, TumblingWindow('10s')
```
### STDDEVS - 样本标准差函数
**语法**: `stddevs(col)`
**描述**: 返回组中所有值的样本标准差。空值不参与计算。
**增量计算**: ✅ 支持(使用韦尔福德算法优化)
**示例**:
```sql
SELECT device, stddevs(temperature) as temp_sample_stddev
FROM stream
GROUP BY device, TumblingWindow('10s')
```
### VAR - 方差函数
**语法**: `var(col)`
**描述**: 返回组中所有值的总体方差。空值不参与计算。
**增量计算**: ✅ 支持(使用韦尔福德算法优化)
**示例**:
```sql
SELECT device, var(temperature) as temp_variance
FROM stream
GROUP BY device, TumblingWindow('10s')
```
### VARS - 样本方差函数
**语法**: `vars(col)`
**描述**: 返回组中所有值的样本方差。空值不参与计算。
**增量计算**: ✅ 支持(使用韦尔福德算法优化)
**示例**:
```sql
SELECT device, vars(temperature) as temp_sample_variance
FROM stream
GROUP BY device, TumblingWindow('10s')
```
### MEDIAN - 中位数函数
**语法**: `median(col)`
**描述**: 返回组中所有值的中位数。空值不参与计算。
**增量计算**: ✅ 支持
**示例**:
```sql
SELECT device, median(temperature) as temp_median
FROM stream
GROUP BY device, TumblingWindow('10s')
```
### PERCENTILE - 百分位数函数
**语法**: `percentile(col, 0.5)`
**描述**: 返回组中所有值的指定百分位数。第二个参数指定百分位数的值,取值范围为 0.0 ~ 1.0。
**增量计算**: ✅ 支持
**示例**:
```sql
SELECT device, percentile(temperature, 0.95) as temp_p95
FROM stream
GROUP BY device, TumblingWindow('10s')
```
## 🔍 分析函数
分析函数用于在数据流中进行复杂的分析计算,支持状态管理和历史数据访问。
### LAG - 滞后函数
**语法**: `lag(col, offset, default_value)`
**描述**: 返回当前行之前的第N行的值。offset指定偏移量,default_value为默认值。
**增量计算**: ✅ 支持
**示例**:
```sql
SELECT device, temperature, lag(temperature, 1) as prev_temp
FROM stream
GROUP BY device, TumblingWindow('10s')
```
### LATEST - 最新值函数
**语法**: `latest(col)`
**描述**: 返回指定列的最新值。
**增量计算**: ✅ 支持
**示例**:
```sql
SELECT device, latest(temperature) as current_temp
FROM stream
GROUP BY device, TumblingWindow('10s')
```
### CHANGED_COL - 变化列函数
**语法**: `changed_col(row_data)`
**描述**: 返回发生变化的列名数组。
**增量计算**: ✅ 支持
**示例**:
```sql
SELECT device, changed_col(*) as changed_columns
FROM stream
GROUP BY device, TumblingWindow('10s')
```
### HAD_CHANGED - 变化检测函数
**语法**: `had_changed(col)`
**描述**: 判断指定列的值是否发生变化,返回布尔值。
**增量计算**: ✅ 支持
**示例**:
```sql
SELECT device, had_changed(status) as status_changed
FROM stream
GROUP BY device, TumblingWindow('10s')
```
## 🪟 窗口函数
窗口函数提供窗口相关的信息。
### WINDOW_START - 窗口开始时间
**语法**: `window_start()`
**描述**: 返回当前窗口的开始时间。
**增量计算**: ✅ 支持
**示例**:
```sql
SELECT device, window_start() as window_begin, avg(temperature) as avg_temp
FROM stream
GROUP BY device, TumblingWindow('10s')
```
### WINDOW_END - 窗口结束时间
**语法**: `window_end()`
**描述**: 返回当前窗口的结束时间。
**增量计算**: ✅ 支持
**示例**:
```sql
SELECT device, window_end() as window_finish, avg(temperature) as avg_temp
FROM stream
GROUP BY device, TumblingWindow('10s')
```
## 🧮 数学函数
数学函数用于数值计算。
### ABS - 绝对值函数
**语法**: `abs(number)`
**描述**: 返回数值的绝对值。
**增量计算**: ❌ 不支持(单值函数)
### SQRT - 平方根函数
**语法**: `sqrt(number)`
**描述**: 返回数值的平方根。
**增量计算**: ❌ 不支持(单值函数)
### POWER - 幂函数
**语法**: `power(base, exponent)`
**描述**: 返回底数的指定次幂。
**增量计算**: ❌ 不支持(单值函数)
## 📝 字符串函数
字符串函数用于文本处理。
### UPPER - 转大写函数
**语法**: `upper(str)`
**描述**: 将字符串转换为大写。
**增量计算**: ❌ 不支持(单值函数)
### LOWER - 转小写函数
**语法**: `lower(str)`
**描述**: 将字符串转换为小写。
**增量计算**: ❌ 不支持(单值函数)
### CONCAT - 字符串连接函数
**语法**: `concat(str1, str2, ...)`
**描述**: 连接多个字符串。
**增量计算**: ❌ 不支持(单值函数)
## 🔄 类型转换函数
类型转换函数用于数据类型转换。
### CAST - 类型转换函数
**语法**: `cast(value as type)`
**描述**: 将值转换为指定类型。
**增量计算**: ❌ 不支持(单值函数)
## ⚡ 增量计算性能优势
支持增量计算的函数具有以下性能优势:
### 内存效率
- **传统批量计算**: 需要存储窗口内所有数据,内存使用 O(n)
- **增量计算**: 只存储必要的状态信息,内存使用 O(1) 或 O(log n)
### 计算效率
- **传统批量计算**: 每次窗口触发都重新计算所有数据,时间复杂度 O(n)
- **增量计算**: 只处理新增数据,时间复杂度 O(1)
### 实时性
- **传统批量计算**: 只能在窗口结束时输出结果
- **增量计算**: 可以实时输出中间结果
### 性能测试结果
根据我们的性能测试:
- **计算速度**: 增量计算比批量计算快 2-3 倍
- **内存使用**: 减少 99.9% 以上的内存占用
- **实时性**: 支持流式处理,实时输出中间结果
## 💡 使用建议
1. **优先使用支持增量计算的函数**: 在大数据量和高频率数据流场景下,优先选择支持增量计算的函数。
2. **合理选择窗口大小**: 窗口大小影响计算精度和性能,需要根据业务需求平衡。
3. **组合使用函数**: 可以在同一个查询中组合使用多个函数,实现复杂的分析需求。
4. **注意数据类型**: 确保输入数据类型与函数要求匹配,避免类型转换错误。
## 🔧 自定义函数扩展
StreamSQL 支持自定义函数扩展,详见 `functions/custom_example.go` 中的示例。可以实现:
- 自定义聚合函数(支持增量计算)
- 自定义分析函数(支持状态管理)
- 自定义数学函数
- 自定义字符串函数
通过实现相应的接口,自定义函数可以无缝集成到 StreamSQL 的函数体系中。