首页 / 窗口
FIRST_VALUE 窗口第一个值
FIRST_VALUE 返回窗口中第一行的值。七个引擎都同名可用,差异在“忽略 NULL”的写法:MaxCompute、Doris、Hive 和 Spark 传第二个布尔参数,StarRocks 用 IGNORE NULLS,Hologres 和 Flink 的文档没有对应写法。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | FIRST_VALUE(expr[, ignore_nulls]) OVER (...) | ignore_nulls 默认为 False,为 True 时返回窗口中第一个非 NULL 值。 | 官方文档 |
| Hologres | 支持 | FIRST_VALUE(value) OVER (...) | Hologres V1.1.71 起由 HQE 引擎支持。文档没有提供忽略 NULL 的参数。 | 官方文档 |
| StarRocks | 支持 | FIRST_VALUE(expr [IGNORE NULLS]) OVER (...) | IGNORE NULLS 2.5.0 起支持,默认包含 NULL。3.5 起支持 ARRAY 类型。 | 官方文档 |
| Doris | 支持 | FIRST_VALUE(expr[, ignore_null]) OVER (...) | ignore_null 为 true 时忽略 NULL,返回第一个非 NULL 值。 | 官方文档 |
| Hive | 支持 | first_value(col[, skip_nulls]) OVER (...) | 最多两个参数,第二个参数默认为 false,设为 true 时跳过 NULL。 | 官方文档 |
| Spark SQL | 支持 | first_value(expr[, isIgnoreNull]) OVER (...) | Spark 2.0.0 起提供。isIgnoreNull 为 true 时只返回非 NULL 值。文档说明结果依赖行的顺序。 | 官方文档 |
| Flink SQL | 支持 | FIRST_VALUE(expression) | 文档中列为聚合函数,返回有序集合中第一个值,没有忽略 NULL 的参数。 | 官方文档 |
迁移注意事项
- 忽略 NULL 的写法不同:MaxCompute、Doris、Hive 和 Spark 传第二个布尔参数,例如 FIRST_VALUE(x, true);StarRocks 写 FIRST_VALUE(x IGNORE NULLS),2.5.0 起支持。Hologres 和 Flink 的文档没有提供忽略 NULL 的写法。
- 默认包含 NULL:不指定忽略时,窗口中第一个值为 NULL 就返回 NULL。用它补齐缺失值时,务必显式忽略 NULL。
- Spark 文档说明结果依赖行的顺序,shuffle 后可能不确定,窗口中要写明 ORDER BY。
示例
取每个用户首次出现的非空渠道
SELECT user_id, FIRST_VALUE(channel, true) OVER (PARTITION BY user_id ORDER BY event_time) AS ch FROM events;SELECT user_id, FIRST_VALUE(channel) OVER (PARTITION BY user_id ORDER BY event_time) AS ch FROM events;SELECT user_id, FIRST_VALUE(channel IGNORE NULLS) OVER (PARTITION BY user_id ORDER BY event_time) AS ch FROM events;SELECT user_id, FIRST_VALUE(channel, true) OVER (PARTITION BY user_id ORDER BY event_time) AS ch FROM events;SELECT user_id, first_value(channel, true) OVER (PARTITION BY user_id ORDER BY event_time) AS ch FROM events;SELECT user_id, first_value(channel, true) OVER (PARTITION BY user_id ORDER BY event_time) AS ch FROM events;