【问题标题】:Clickhouse Cross join workaround?Clickhouse 交叉加入解决方法?
【发布时间】:2022-01-03 12:54:49
【问题描述】:

我正在尝试计算 Clickhouse 中每个 IP 地址的错误交易状态的百分比。


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

不幸的是,Clickhouse 拒绝了:

"从服务器收到异常(版本 20.8.3): 代码:47。DB::Exception:从 127.0.0.1:9000 接收。 DB::Exception: 未知标识符:total_calls 有列:source_ip, COUNT(source_ip)。"

我为“隐形”别名尝试了各种解决方法,但都失败了。任何帮助将不胜感激。

【问题讨论】:

标签: sql join alias clickhouse


【解决方案1】:
SELECT
    source_ip,
    countIf(status = 8 OR status = 9 or status = 13) AS failed,
    failed / count()  * 100 AS percent_faulty
FROM sip_transaction_call 
GROUP BY source_ip

【讨论】:

【解决方案2】:

如果你有一个 GROUP BY 子句,你只能使用你分组的列(即c.source_ip) - 对于其他人你需要一个聚合函数。

Clickhouse 在这里没有太大帮助 - 对于几乎任何其他引擎,您都会收到更有意义的错误。见https://learnsql.com/blog/not-a-group-by-expression-error/

无论如何,将分组更改为GROUP BY c.source_ip, t.total_calls 以修复它。

【讨论】:

  • 谢谢。不幸的是,这并没有达到我想要的效果。我想计算每个 IP 的错误交易的百分比,而不是所有交易的总数。对于 percent_faulty,我需要除以每个 IP 的总数,而不是所有 IP 的总数。
猜你喜欢
  • 1970-01-01
  • 2017-03-05
  • 1970-01-01
  • 2013-05-08
  • 1970-01-01
  • 2013-03-11
  • 1970-01-01
  • 1970-01-01
  • 2023-01-24
相关资源
最近更新 更多