在 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 查询中结合 TIME_FLOOR 和 MILLIS_TO_TIMESTAMP 以获取纪元时间戳