我的查询看起来像这样:
SELECT COUNT(DISTINCT A) as a_distinct,
COUNT(DISTINCT B) as b_distinct,
COUNT(DISTINCT A)/COUNT(DISTINCT B) as a_b_ratio
FROM
sometable_ab
正如我们所看到的,这看起来非常低效,因为即使计算了聚合函数,它们也会运行两次。我只能想到一个问题的解决方案,将其分解为两个查询。这是唯一可能的解决方案。或者是他们可以做到的更有效的解决方案。我正在使用Redshift DB,它主要使用postgresql,但是甚至MYSQL的解决方案也是可以接受的,因为我无法想到任何数据库中有效地执行此操作的方法。
答案 0 :(得分:3)
如果您担心性能影响,只需使用子查询:
SELECT a_distinct, b_distinct, a_distinct / b_distinct as a_b_ratio
FROM (SELECT COUNT(DISTINCT A) as a_distinct,
COUNT(DISTINCT B) as b_distinct
FROM sometable_ab
) ab
对于大多数聚合函数,这都是无关紧要的,但count(distinct)
可能是一种性能损失。
这是ANSI标准SQL,应该适用于您提及的任何数据库。
答案 1 :(得分:0)
对于任何RDBMS,使用子查询仍然算作一个查询。更重要的是,count()
永远不会返回NULL,但如果没有找到行则为0(或者任何行中给定表达式没有非空值)。这将导致您直接进入除以零异常。使用NULLIF
(也是标准SQL)修复它。在这种情况下,您将获得NULL。
SELECT *, a_distinct / NULLIF(b_distinct, 0) AS a_b_ratio
FROM (
SELECT count(DISTINCT a) AS a_distinct
, count(DISTINCT b) AS b_distinct
FROM sometable_ab
) sub;