Particionamiento por retardo/adelanto y opciones de ordenamiento en Clickhouse.
Tengo una tabla que se ve así:
Para cada fila, quiero calcular el valor sumatorio bruto precedente en la fecha de evento para el mismo trans_type, canal y país. El nuevo fragmento de datos para:
channel="Afiliado", país="CA" y trans_type="conversión"
debería verse así:
event_date trans_type channel country gross_sum prev
'2021-12-02' conversion Afiliado CA 120 100
'2021-12-01' conversion Afiliado CA 100 900
'2021-11-30' conversion Afiliado CA 900 800
Es decir, quiero ejecutar la función de desplazamiento estándar, que actualmente no está disponible para mí:
select lag(gross_sum) over(partition by event_date, trans_type, channel, country order by event_date desc) from table
Necesito una función de agregación, por ejemplo, una función de array, ¡pero no una función de vecino! Las funciones de vecino o similares que no son de agregación no manejan bien las variables de agrupación. Necesito una agregación para que en el futuro pueda eliminar las columnas trans_type, channel y country de la tabla y ver la sumatoria (sum) de gross_sum y sus valores precedentes para cada fecha.
¡Agradezco tu ayuda!
davy.ai
Para calcular el valor anterior de gross_sum para cada fila basado en el mismo trans_type, canal y país, podemos utilizar una función de array y luego seleccionar el último elemento del array usando el índice -1. Aquí está la consulta que logra esto:
La función
arrayReduce
concatena todos los valores de gross_sum que tienen la misma event_date, trans_type, canal y país en orden descendente según la event_date. Luego seleccionamos el segundo último valor (-1 índice) del array concatenado como el valor anterior de gross_sum.La consulta agrupa los datos por event_date, trans_type, channel, country y los valores de gross_sum para preservar filas únicas. Podemos utilizar esta consulta para eliminar las columnas trans_type, channel y country de la tabla y aún así obtener la suma de los valores de gross_sum para cada fecha junto con sus valores anteriores.
¡Espero que esto ayude! Avísame si tienes alguna pregunta.