Saltar al contenido
Roman Prokashev.

Este es un archivo del blog Last Click City, publicado en lastclick.city entre 2019 y 2024.

1 min de lecturaPor Sergey Matrosov

Desanidar datos clave-valor relativos a objetos en columnas distintas.

Si tienes una base de datos con una tabla de datos en bruto, en la que la primera columna es el user-id o la fecha y las otras dos son el nombre y el valor de los parámetros de tu URL, tal que así:

Tabla con datos en bruto

y quieres transformarla en una tabla como esta:

Tabla transformada

He preparado soluciones para dos bases de datos: Clickhouse y PostgreSQL. Este artículo se basa en la primera, pero aquí también encontrarás una consulta para PostgreSQL.

Primero tenemos que generar una tabla de datos con una consulta, usando las columnas «userid», «name» y «value», igual que hicimos al escribir los modelos de atribución sencillos con BigQuery.

Modificando la tabla

El resultado es una tabla como la de la primera captura. Después hay que usar la construcción CASE...WHEN para convertir la columna «name» en columnas cuyo nombre sean los valores de esa columna. El valor de esas columnas nuevas será el valor de la columna «value».

Uso de la construcción CASE...WHEN

Este es nuestro resultado:

Modificando la tabla

El problema salta a la vista: no solo hay muchas celdas vacías, sino que queríamos una sola fila por usuario. Si has pensado en GROUP BY, vas bien encaminado, pero necesitamos la función adecuada. Primero eché mano de una función de arrays llamada groupArray:

Uso de la función groupArray

No olvides usar la instrucción GROUP BY userid:

GROUP BY userid

Esta es la tabla ya modificada:

Tabla modificada

Ya casi estamos; la última función es arrayJoin, que desanidará ese array en las filas de siempre.

Uso de la función arrayJoin

Y aquí está:

resultado final

Espero que te haya servido. ¡Suerte!

Traducido del inglés con Claude.

← Volver a Last Click City