将聚合函数中的两个值相除?

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    
...
...
...

现在每周我需要做以下事情:

每周共有多少个PARTTEMP。我们称之为total。在ColF 中,除了PARTTEMP 之外,我还可以有其他值,例如空字符串或任何其他值。我只需要计算PARTTEMP。 每周有多少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 实现聚合后两个字段相除相加相减相乘,运算

使用 NSPredicate 中的聚合函数检查 BOOL 值

聚合函数将多行中的值汇总到一个结果行中

带有子查询的 SQL 多个聚合函数

SqlServer函数的聚合函数

sql 2005 聚合函数