将聚合函数中的两个值相除?
Posted
技术标签:
【中文标题】将聚合函数中的两个值相除?【英文标题】:Divide two values in aggregation functions? 【发布时间】:2020-11-21 01:41:26 【问题描述】:我有一个这样的表格视图:
week ColB ColF
---------------------
45 1234 PART
45 8215 TEMP
45 2834 PART
45 4152 PART
45 5775 TEMP
45 6527 PART
45 1162 TEMP
45 9154
45 2162
46 4232 PART
46 3215 PART
46 5834 PART
46 6152 PART
46 7775 TEMP
46 8527 PART
46 9162 TEMP
46 2354
46 2562
46 9762
...
...
...
现在每周我需要做以下事情:
每周共有多少个PART
和TEMP
。我们称之为total
。在ColF
中,除了PART
和TEMP
之外,我还可以有其他值,例如空字符串或任何其他值。我只需要计算PART
和TEMP
。
每周有多少TEMP
。我们称之为temp
。
对于每周,将temp
/total
相除,得到result
的小数点后三位。如果result
为 0,那么它应该只显示 0。
所以输出应该是这样的。基本上按周列分组。
week ratio
---------------------
45 0.054
46 0.345
47 0.224
48 0.456
所以我尝试了这样,它完成了工作,但是我需要先计算百分比然后除以 100 才能得到我需要的吗?我确实认为这可以改进,所以我不应该先计算百分比。我应该能够在不做百分比的情况下得到结果。
select week, (avg(case when colf = 'TEMP' then 100.0 else 0 end) / 100 ) as ratio
from process
where colf in ('PART', 'TEMP')
group by week
这有可能吗?
【问题讨论】:
【参考方案1】:您只需使用1.0
即可简化比率计算:
select week, avg(case when colf = 'TEMP' then 1.0 else 0 end) as ratio
from process
where colf in ('PART', 'TEMP')
group by week;
或者,更简单地说:
select week, avg( (colf = 'TEMP')::int ) as ratio
from process
where colf in ('PART', 'TEMP')
group by week;
Here 是一个 dbfiddle(使用 Postgres)。
【讨论】:
我尝试了您的第一个建议,我收到了0
几个星期,但它们的值是 0.027
。知道为什么会这样吗?
你用的是1.0还是1?
正是您在第一个建议中的内容。
@AndyP 。 . .我添加了一个 dbfiddle(使用 Postgres)。
我用的是redshift数据库,有什么不同吗?【参考方案2】:
基于 Gordon 的回答,小数点后面的零应该与要返回的小数位数相匹配 - 这是我为 redshift 找到的。
选择周,平均(colf = 'TEMP' 然后 1.000 否则 0 结束的情况)作为比率 从过程 colf in ('PART', 'TEMP') 按周分组;
【讨论】:
以上是关于将聚合函数中的两个值相除?的主要内容,如果未能解决你的问题,请参考以下文章
elasticsearch 实现聚合后两个字段相除相加相减相乘,运算