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.

La función de vecinos con dos o más variables de agrupación en Clickhouse no funciona.

Tengo una tabla que se ve así:

 fecha         canal     suma
    2021-01-02    Media     1200
    2021-01-02    Direct    2300
    2021-01-01    Media     800
    2021-01-01    Direct    900

Quiero usar la función standard lag() para cada fila y mostrar la suma del día anterior para un cierto canal. Por lo tanto, la tabla se verá así:

 fecha         canal     suma   previo
2021-01-02    Media     1200   800
2021-01-02    Direct    2300   900
2021-01-01    Media     800    500
2021-01-01    Direct    900    600

Estoy usando la versión Clickhouse anterior a 21.3 por lo que no puedo usar ninguna función de ventana estándar. Intenté usar la función neighbour() pero no funciona con más de una variable de agrupación – los resultados son incorrectos:

SELECT fecha_evento,
       canal,
       neighbor(suma, -1) as previo
from ejemplo
group by fecha_evento, canal

¡Por favor, ayúdame!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Dado que no puede usar funciones estándar de ventanas en la versión 21.3 o anterior de Clickhouse, puede utilizar una auto-asociación para lograr el resultado deseado. Aquí hay un ejemplo de consulta para hacer esto:

    SELECT t1.date,
           t1.canal,
           t1.suma,
           t2.suma as anterior
    FROM ejemplo t1
    LEFT JOIN ejemplo t2 ON t1.canal = t2.canal
                         AND t1.date - 1 = t2.date
    

    Explicación:

    • Estamos realizando una auto-asociación en la tabla ejemplo utilizando LEFT JOIN.
    • La primera tabla de la unión (t1) representa la fila actual, mientras que la segunda tabla (t2) representa la fila anterior para el mismo canal, pero en la fecha anterior (t1.date - 1 = t2.date).
    • En la lista de selección, ahora podemos acceder a t1.suma y t2.suma para mostrar la suma actual y la suma del día anterior para cada canal, respectivamente.

    Nota: como estamos usando un LEFT JOIN, la columna anterior puede ser NULL para la primera fecha de cada canal, ya que no hay un día anterior para calcular la suma de ella.

Comments are closed.