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.

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.

Tags:  , , ,

Answer

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

    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
        WHERE (status = 8 OR status = 9 or status = 13)
    ) AS t
    WHERE (status = 8 OR status = 9 or status = 13)
    GROUP BY c.source_ip
    

    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 un CROSS JOIN, que básicamente crea un producto cartesiano y calcula el número total de llamadas para cada source_ip.

    Ten en cuenta que esta solución alternativa asume que la columna status existe en la tabla sip_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.

Comments are closed.