Función lambda ClickHouse en el modificador SELECT APPLY.
Estoy trabajando en una consulta que pretende proporcionar desde un grupo de pk por agregación, los valores que corresponden al valor máximo de un campo de marca de tiempo que tengo.
Basé mi código en la solución propuesta para esta pregunta:
https://stackoverflow.com/questions/68849789/apply-argmax-over-multiple-columns-in-clickhouse
Mi código resultante tiene esta forma:
SELECT * EXCEPT(Timestamp
) APPLY(i->argmax(i,Timestamp
))
FROM some_table
GROUP BY pk;
Estoy obteniendo el siguiente error:
DB::Exception: Syntax error: failed at position 35 (‘->’) (line 1, col 35): ->argMax(i,Timestamp)) ……
Intento evitar usar una consulta mucho más detallada especificando en SELECT un argmax () para cada columna, tengo más de 100 columnas…
¿Alguien tiene alguna idea al respecto?
davy.ai
Se ve que el error está relacionado con la sintaxis
->
que se está utilizando en lugar de->
. Intenta cambiar tu código por el siguiente:Esto debería resolver el error de sintaxis que estás encontrando.
En cuanto a tu pregunta sobre evitar una consulta larga con
argmax()
para cada columna, puedes intentar utilizar las capacidades de programación funcional de ClickHouse para crear una función definida por el usuario que apliqueargmax()
a todas las columnas al mismo tiempo. De esta manera, simplemente puedes llamar a la función en tu consulta y evitar tener que especificarargmax()
para cada columna individualmente.Aquí tienes un ejemplo de cómo puedes crear una función en ClickHouse que aplique
argmax()
a todas las columnas:Luego puedes llamar a esta función en tu consulta de la siguiente manera:
Ten en cuenta que en la función
argmax_all()
,x
ey
representan dos funciones agregadas que se pasan como parámetros. En la consulta, se utiliza*
como primer parámetro para representar todas las columnas, yTimestamp
se utiliza como segundo parámetro. Esto aplicaráargmax()
a todas las columnas exceptoTimestamp
y devolverá los valores agregados para cada grupo.¡Espero que esto te ayude! Avísame si tienes alguna pregunta adicional.