【问题标题】:SUM aggregation do not work on empty subqueries with DRUIDSUM 聚合不适用于具有 DRUID 的空子查询
【发布时间】:2021-10-22 02:11:06
【问题描述】:

假设我在 Druid 上执行以下两个查询:

SELECT COUNT(DISTINCT field_1) FROM my_table WHERE field_2 = 10 
SELECT COUNT(DISTINCT field_1) FROM my_table WHERE field_2 = 11 

我尝试将两个计数与一个总和聚合组合在一个查询中,如下所示:

Select q1.totalcount + q2.totalcount FROM 
(SELECT COUNT(DISTINCT field_1) AS totalcount 
FROM my_table WHERE field_2 = 10) as q1,
(SELECT COUNT(DISTINCT field_1) AS totalcount 
FROM my_table WHERE field_2 = 11) as q2

除非两个计数之一返回 0 行,否则它运行良好。

在这种情况下,我会收到一条 Query returned no data 消息,即使两个子查询之一返回了一些结果,我也没有来自 SUM 查询的任何最终结果。

我该如何解决这个问题?

【问题讨论】:

  • DISTINCT 不是一个函数,它是一个集合量词。跳过那些多余的括号以避免混淆 - 即只需执行 COUNT(DISTINCT field_1)

标签: sql count case distinct druid


【解决方案1】:

为什么不把所有的东西都算在一起呢?:

SELECT COUNT(DISTINCT(field_1)) FROM my_table WHERE field_2 in (10,11) 

也是你添加计数的方式,如果两个计数选择之间有任何共同的 field_1,你将计算它们两次。

【讨论】:

  • 这是一个很好的解决方案,但仅适用于添加。我正在寻找一种更通用的解决方案,让我可以进行减法、除法和乘法运算。
【解决方案2】:

CASE 表达式使用条件聚合:

SELECT COUNT(DISTINCT CASE WHEN field_2 = 10 THEN field_1 END) +
       COUNT(DISTINCT CASE WHEN field_2 = 11 THEN field_1 END)
FROM my_table 
WHERE field_2 IN (10, 11);

请注意,如果 field_1 值在 field_2 = 10field_2 = 11 的两组中都相同,则它会被计入两组中,就像您的代码一样。

【讨论】:

    猜你喜欢
    • 2011-09-27
    • 2015-11-13
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 2021-08-23
    相关资源
    最近更新 更多