在 Apache Druid 中使用 SQL 将聚合函数应用于某些列

Posted

技术标签:

【中文标题】在 Apache Druid 中使用 SQL 将聚合函数应用于某些列【英文标题】:Apply aggregate function to certain columns using SQL in Apache Druid 【发布时间】:2020-08-23 14:48:32 【问题描述】:

我有一张这样的桌子

----------------------
code    sales    goal
----------------------
  b       7       20
  b      12       20
  a       9       15
  c       4        3
  a       4       15

我想执行一个 agg 函数以仅在“销售”列上按总和进行分组,因为“目标”列对于“代码”列中的给定值是通用的,以获得更像这样的东西

---------------------------------
code    total    goal
---------------------------------
  b       19      20
  a       13      15
  c        4       3

有没有办法执行这样的事情?

SELECT code, SUM(sales) AS total, goal FROM such_table GROUP BY code

然后对列进行操作,实现以后的操作:

------------------------------------------------------
code    sum(sales)   intact(goal)  achvd(100*sum/goal)
------------------------------------------------------
  b         19           20               95
  a         13           15               86.6
  c          4            3              133.3

【问题讨论】:

如果您确定每个代码的目标是相同的,您可以在您的select 语句中输入MAX(goal);如果您不确定,请将code, goal 放入您的group by 声明中 您使用的是哪种 SQL 风格? sql server、mysql 等你能标记一下吗?同样在您的示例中,b 的值如何可以是19?应该是21 我不明白intact(goal) 应该是什么。 嗨@a_horse_with_no_name 这样的列代表自己,未更改或完整,抱歉造成混淆 嗨 @zealous 我正在使用 Apache Druid,但有一些限制,例如无法使用 JOIN 函数,就像在 b 值中一样,我需要将其相加 7 + 12由于agg函数SUM执行操作 【参考方案1】:

感谢所有为这个答案做出贡献的人,我想通过阅读您和上网来发布我使用的解决方案。 给定表such_table

----------------------
code    sales    goal
----------------------
  b       7       20
  b      12       20
  a       9       15
  b       2       20
  c       4        3
  a       4       15

应用以下查询时:

SELECT
  code,
  SUM(sales) AS total,
  goal
FROM such_table
GROUP BY code, goal;

下表中的结果:

---------------------
code    total    goal
---------------------
  b      19       20
  a      13       15
  c       4        3

因此,为了显示所需的结果,使用下一个查询:

SELECT
  code,
  SUM(sales) AS total,
  goal,
  100 * (SUM(sales) / goal) AS prc_of_goal
FROM such_table
GROUP BY code, goal;

结果如下:

-----------------------------------
code    total    goal   prc_of_goal
-----------------------------------
  b      19       20       95
  a      13       15       86.67
  c       4        3      133.33

这是我要找的 谢谢大家 :D

【讨论】:

【参考方案2】:

group by 中包含goal

SELECT code, SUM(sales) AS total, goal, SUM(sales) * 1.0 / goal as ratio
FROM such_table
GROUP BY code, goal;

或者将其作为聚合函数的参数:

SELECT code, SUM(sales) AS total, MAX(goal) as goal,
       SUM(sales) * 1.0 / MAX(goal) as ratio
FROM such_table
GROUP BY code;

如果您的数据实际上是以这种方式构建的,那么您的数据模型就有问题。 goal 不应在每一行上重复。你应该有一个表,每个code 一行,并且该表应该有goal。那么这个表就可以只包含销售额了。

【讨论】:

嗨@Gordon,至于数据模型,是的,它有点乱,但想法是将具有相同code 的各个寄存器相加,以加起来goal 变量,谢谢你的答案都很好。虽然我需要操作来自GROUP BY 的结果列以将它们与百分比相关联,但这是我遇到的问题。感谢您的时间! :D @S_B04 。 . .比例只是除法。我将其添加到答案中。

以上是关于在 Apache Druid 中使用 SQL 将聚合函数应用于某些列的主要内容,如果未能解决你的问题,请参考以下文章

Apache Druid的SQL查询使用手册

在 Apache Druid SQL 查询中结合 TIME_FLOOR 和 MILLIS_TO_TIMESTAMP 以获取纪元时间戳

druid

大数据Apache Druid:使用Imply进行Druid集群搭建

数据库连接池之Druid

大数据Apache Druid:使用Imply进行Druid集群搭建