首页 / 条件、空值和类型转换
GREATEST 多值取最大
GREATEST 返回参数中的最大值。差异主要在 NULL:StarRocks、Doris、Hive 2.0 起和 Flink 只要有一个参数为 NULL 就返回 NULL;MaxCompute 默认和 Spark 会跳过 NULL。同样的 SQL 迁移后可能从有值变成 NULL。LEAST 的规则相同。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | GREATEST(var1, var2[, ...]) | 默认把 NULL 视为最小值,即跳过 NULL;开启 Hive 兼容模式(odps.sql.hive.compatible=true)后,任一参数为 NULL 时返回 NULL。类型不同时按规则隐式转换。 | 官方文档 |
| Hologres | 支持 | GREATEST(value1, value2, ...) | 文档没有说明 NULL 参数的处理方式,迁移前建议实测。 | 官方文档 |
| StarRocks | 支持 | GREATEST(expr1, ...) | 任一参数为 NULL 时返回 NULL。有 DOUBLE 参数时按 DOUBLE 比较;数字和字符串混合时,字符串能转成数字就按数字比较。 | 官方文档 |
| Doris | 支持 | GREATEST(expr[, ...]) | 任一参数为 NULL 时返回 NULL。建议传入同类型参数,类型不同时会尝试转换。 | 官方文档 |
| Hive | 支持 | greatest(T v1, T v2, ...) | Hive 1.1.0 起提供。2.0.0 起任一参数为 NULL 时返回 NULL,类型限制也放宽为与 > 运算符一致。 | 官方文档 |
| Spark SQL | 支持 | greatest(expr, ...) | Spark 1.5.0 起提供,跳过 NULL 值。 | 官方文档 |
| Flink SQL | 支持 | GREATEST(value1[, value2]*) | 任一参数为 NULL 时返回 NULL。 | 官方文档 |
迁移注意事项
- NULL 处理分两派:MaxCompute 默认和 Spark 跳过 NULL;StarRocks、Doris、Hive 2.0 起和 Flink 遇到 NULL 返回 NULL。从 MaxCompute 或 Spark 迁出时,GREATEST(a, b) 在 b 为 NULL 的行上会从 a 变成 NULL。
- 需要“跳过 NULL”的效果时,可以先用 COALESCE 补默认值,例如 GREATEST(COALESCE(a, 0), COALESCE(b, 0)),补什么值要按业务确定。
- MaxCompute 开启 Hive 兼容模式后行为会变成遇 NULL 返回 NULL,同一个项目中不同作业的设置可能不一致。
- 参数类型不同时各引擎的隐式转换规则不同,例如数字和字符串混合比较。建议先统一 CAST 再比较。
示例
取两个时间中较晚的一个
SELECT GREATEST(pay_time, ship_time) AS last_time FROM orders;SELECT GREATEST(pay_time, ship_time) AS last_time FROM orders;SELECT GREATEST(pay_time, ship_time) AS last_time FROM orders;SELECT GREATEST(pay_time, ship_time) AS last_time FROM orders;SELECT greatest(pay_time, ship_time) AS last_time FROM orders;SELECT greatest(pay_time, ship_time) AS last_time FROM orders;SELECT GREATEST(pay_time, ship_time) AS last_time FROM orders;