es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  ,

Answer

  1. Avatar for 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:

    SELECT * EXCEPT(`Timestamp`) APPLY(i->argmax(i,`Timestamp`))
    FROM some_table
    GROUP BY pk;
    

    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 aplique argmax() a todas las columnas al mismo tiempo. De esta manera, simplemente puedes llamar a la función en tu consulta y evitar tener que especificar argmax() 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:

    CREATE FUNCTION argmax_all(x AggregateFunction, y AggregateFunction) -> AggregateFunction 
    LANGUAGE SQL 
    IMMUTABLE
    AS $$
      (argMax(x, y), argMax(y, x))
    $$;
    

    Luego puedes llamar a esta función en tu consulta de la siguiente manera:

    SELECT argmax_all(*, `Timestamp`) 
    FROM some_table 
    GROUP BY pk;
    

    Ten en cuenta que en la función argmax_all(), x e y representan dos funciones agregadas que se pasan como parámetros. En la consulta, se utiliza * como primer parámetro para representar todas las columnas, y Timestamp se utiliza como segundo parámetro. Esto aplicará argmax() a todas las columnas excepto Timestamp y devolverá los valores agregados para cada grupo.

    ¡Espero que esto te ayude! Avísame si tienes alguna pregunta adicional.

Comments are closed.