首页 / 分区
MAX_PT 取最新分区
MAX_PT 返回分区表中有数据的最大一级分区,常用于“只读最新一天”。只有阿里云的 MaxCompute 和 Hologres 提供,迁移到其他引擎时必须改写为子查询。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | MAX_PT(table_full_name) |
按字母顺序返回有数据的最大一级分区,只看一级分区。OSS 外部表也支持。所有分区都为空时会报错。 | 官方文档 |
| Hologres | 支持 | MAX_PT('table_name') |
返回 Hologres 分区表的最大分区。文档没有说明版本要求和是否支持外部表。 | 官方文档 |
| StarRocks | 不支持 | — | 在 StarRocks 官方文档中搜索不到 MAX_PT。改写为 WHERE pt = (SELECT MAX(pt) FROM t)。 | 官方文档 |
| Doris | 不支持 | — | 在 Doris 官方文档中搜索不到 MAX_PT。改写为 WHERE pt = (SELECT MAX(pt) FROM t)。 | 官方文档 |
| Hive | 不支持 | — | 函数手册中没有 MAX_PT。改写为 WHERE pt = (SELECT MAX(pt) FROM t)。 | 官方文档 |
| Spark SQL | 不支持 | — | 函数索引中没有 MAX_PT。改写为 WHERE pt = (SELECT MAX(pt) FROM t)。 | 官方文档 |
| Flink SQL | 不支持 | — | 内置函数中没有 MAX_PT。流式作业没有“最新分区”的概念,批模式下可以用子查询改写。 | 官方文档 |
迁移注意事项
- MAX_PT 按字符串的字母顺序比较。分区值格式不统一时,例如同时存在 20261001 和 2026-10-01,结果可能不符合预期。
- MaxCompute 的 MAX_PT 只看一级分区。多级分区表官方建议直接用子查询。
- MaxCompute 中用 ALTER TABLE 建出的空分区不参与计算;所有分区都为空时会报错。MaxCompute 没有 MIN_PT,取最小分区用 MIN(pt) 子查询。
- MaxCompute 官方给出的等价写法是 WHERE pt = (SELECT MAX(pt) FROM tbl),可以直接用于其他引擎。改写后的子查询需要扫描分区列,表很大时确认目标引擎能做分区裁剪。
示例
只读最新分区
SELECT * FROM dim_store WHERE pt = MAX_PT('project.dim_store');SELECT * FROM dim_store WHERE pt = (SELECT MAX(pt) FROM dim_store);