postgresql postgres查询,在agregate之前计算

oipij1gg  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(114)

这是我的结构表。
1.第一个表具有将被评估人员的信息
表master_object
| id|姓名|
| - -----|- -----|
| 1|标记|
| 2|苏岑|
1.秒表是人的可用指标和答案值的列表
表记录_indikator
| 对象ID|活跃|瓦尔|指示符ID|
| - -----|- -----|- -----|- -----|
| 1| 0| 0| 1|
| 2| 1| 0| 2|
| 3| 1| 1| 3|
| 4| 1| 1| 1|
| 5个|0| 1| 2|
| 六|1| 1| 3|
我将用连接表计算结果,结果很简单

who much person aswer  all indicator with status active / how much person

如何计算所有活动指标所占人数

示例对于object_id =1,他们有1个回答,然后2个indikator活动意思是对象1没有回答所有indikator。因此对象1值为零。
-————————————————————————————————————————————————————-
示例对于object_id =2,有2个应答,然后有2个指示器处于活动状态

意思是对象2回答所有指示符,对象2的值为1。
因此,在此之后将聚合所有值(0(对象1)+ 1(对象2))/2 Person = 0.5

问题是如何构建高效的查询以获得此结果?

和mybe有任何sugestion arstiketurs或引擎,以支持这更快。请注意,此记录对象超过3亿

cxfofazt

cxfofazt1#

如果我理解正确的话,你想知道回答所有指标的人的百分比。这可以通过一些条件聚合来实现:
首先,我们需要确定每个人的总活跃答案:

select r.object_id, sum(case when is_active=1 then 1 else 0 end) as total_actives, count(*) as total_records
from master_object m
inner join records_indikator r on r.object_id = m.id
group by r.object_id

然后检查总数是否相等并做一些数学运算

select sum(case when total_actives = total_records then 1 else 0 end)::float/ count(*) as percentage
from (
  select r.object_id, sum(case when is_active=1 then 1 else 0 end) as total_actives, count(*) as total_records
  from master_object m
  inner join records_indikator r on r.object_id = m.id
  group by r.object_id
) as s

Demo here

相关问题