ClickHouse使用APPLY修饰符结合lambda执行argMax报语法错误如何解决
ClickHouse按主键分组取最新行免逐个写字段解决方案
报错原因
你遇到的->语法报错是因为APPLY搭配Lambda表达式的用法仅在ClickHouse 21.8及更高版本支持,低版本无法识别该语法。
可行解决方案(无需逐个声明100+字段的argMax)
方案1:tuple打包+自动展开(推荐,兼容大部分版本)
利用ClickHouse内置的tuple打包和字段自动映射能力,一次性对所有非分组、非排序字段做argMax聚合:
SELECT pk, -- 打包除pk、Timestamp外的所有字段,按Timestamp取最大值对应的整行数据后自动展开为原字段 argMax(tuple(* EXCEPT(pk, `Timestamp`)), `Timestamp`).* FROM some_table GROUP BY pk
如果需要同时返回每组最大的Timestamp值,只需要在SELECT列表中新增max(Timestamp) AS max_ts即可。
方案2:动态SQL拼接(兼容所有ClickHouse版本)
如果使用的是特别老旧的ClickHouse版本,可以通过查询系统表动态拼接聚合语句,避免手动写100+字段:
- 先执行字段拼接查询,得到聚合字段列表:
SELECT groupArrayConcat(concat('argMax(`', name, '`, `Timestamp`) AS `', name, '`), ', ') FROM system.columns WHERE `table` = 'some_table' AND `database` = currentDatabase() AND `name` NOT IN ('pk', 'Timestamp')
- 把上一步查询得到的字符串,替换到下面语句的
[聚合字段列表]位置后执行即可:
SELECT pk, [聚合字段列表] FROM some_table GROUP BY pk
内容的提问来源于stack exchange,提问作者RChaos
相关产品推荐
相关产品推荐

