Solución alternativa para el cruce de tablas en Clickhouse.
Estoy tratando de calcular el porcentaje de estados de transacción defectuosos por dirección IP en Clickhouse.
SELECT
c.source_ip,
COUNT(c.source_ip) AS total,
(COUNT(c.source_ip) / t.total_calls) * 100 AS percent_faulty
FROM sip_transaction_call AS c
CROSS JOIN
(
SELECT count(*) AS total_calls
FROM sip_transaction_call
) AS t
WHERE (status = 8 OR status = 9 or status = 13)
GROUP BY c.source_ip
Desafortunadamente, Clickhouse rechaza esto con:
“Received exception from server (version 20.8.3):
Code: 47. DB::Exception: Received from 127.0.0.1:9000. DB::Exception: Identificador desconocido: total_calls, hay columnas: source_ip, COUNT(source_ip).”
Intenté varios métodos alternativos para el alias “invisible”, pero fallé. Cualquier ayuda sería muy apreciada.
davy.ai
Parece que el problema con la consulta radica en el hecho de que el alias
total_calls
no es reconocido en la subconsulta debido a la forma en que Clickhouse maneja los alias de columna. Una posible solución alternativa es utilizar una subconsulta anidada para calcular el número total de llamadas y luego unirlo con la consulta principal:Esto debería funcionar porque la subconsulta anidada solo contará el número de llamadas que cumplan con la condición en la cláusula
WHERE
, que es la misma condición que en la consulta principal. Luego, el resultado se une con la consulta principal utilizando unCROSS JOIN
, que básicamente crea un producto cartesiano y calcula el número total de llamadas para cadasource_ip
.Ten en cuenta que esta solución alternativa asume que la columna
status
existe en la tablasip_transaction_call
y tiene valores de 8, 9 o 13 para transacciones defectuosas. Si este no es el caso, es posible que debas ajustar la consulta en consecuencia.