组的postgresql平均值(计数)

组的postgresql平均值(计数),sql,postgresql,Sql,Postgresql,我有两张桌子,一个人和一个人。Person表由以下列组成:id、name、DOB和while 违规表:违规id、人员id (违规id不是密钥,因为事件可能涉及多人。) 我想找出每个年龄组的平均违规数量:18-40、41-65和66岁以上。因此,这是我第一次尝试为每个组返回相同的结果。有人能指导我解决这个问题吗?先谢谢你 WITH ages AS ( select EXTRACT(YEAR FROM age(cast(DOB as date))) as age from person ) SE

我有两张桌子,一个人和一个人。Person表由以下列组成:id、name、DOB和while 违规表:违规id、人员id

(违规id不是密钥,因为事件可能涉及多人。)

我想找出每个年龄组的平均违规数量:18-40、41-65和66岁以上。因此,这是我第一次尝试为每个组返回相同的结果。有人能指导我解决这个问题吗?先谢谢你

WITH ages AS

(
select EXTRACT(YEAR FROM age(cast(DOB as date))) as age
from person
)

SELECT
   avg(violation_count) AS avg_violation_count,
 
   case

                    when  age between 18 and 40 then 1
                    when  age between 41 and 65 then 2
                    when  age >= 66 then 3
    end as age_category

FROM  (Select count(violation_id) as violation_count
   from violations
   group by violation_id) V, ages

natural join violations

group by age_category
;

你需要在两组之间加入一个
join
——我只是建议你永远不要使用
natural join
。忘了它的存在吧

如果您想计算每个年龄组的违规行为,则如下所示:

select (case when age < 18 then '< 18'
             when age <= 40 then 'between 18 and 40'
             when age <= 65 then 'between 41 and 65'
             else '> 65'
        end) as age_category,
       count(*)
from violations v join
     persons p
     using (person_id)
group by age_category ;
选择(年龄<18岁时的情况,然后选择“<18”
当年龄时,以下是步骤:

  • 首先按组计算事件数
  • 使用子查询计算百分比
您需要这样编写查询

select 
age_category, count_, (count_*100)/sum(count_) over() "avg_violation_count"
from(
select 
case
when  EXTRACT(YEAR FROM age(cast(DOB as date))) between 18 and 40 then 1
when  EXTRACT(YEAR FROM age(cast(DOB as date))) between 41 and 65 then 2
when  EXTRACT(YEAR FROM age(cast(DOB as date))) >= 66 then 3
end as age_category, count(*) "count_"

from
person t1 inner join violations t2 on t1.id=t2.person_id
group by 1
) tab


什么是“平均违规次数”?我知道计数是什么,但在这种情况下不是平均数。违规总数是1000。为了解释每组的平均违规次数,我将举一个例子:在组1中,假设我有100次违规,所以我试图得到100/1000的结果(组1的平均值)。其他年龄组也一样。感谢您的快速响应,我正试图通过跟随您的线索使其工作。问题是它仍然没有返回每个年龄组的平均数。@Maria只需在计数(*)后添加平均值(名称):-)由于此消息,我无法编辑“编辑队列目前已满-请在几分钟后重试!“非常感谢您,这非常有帮助,我根据您的建议解决了问题!
select 
age_category, count_, (count_*100)/sum(count_) over() "avg_violation_count"
from(
select 
case
when  EXTRACT(YEAR FROM age(cast(DOB as date))) between 18 and 40 then 1
when  EXTRACT(YEAR FROM age(cast(DOB as date))) between 41 and 65 then 2
when  EXTRACT(YEAR FROM age(cast(DOB as date))) >= 66 then 3
end as age_category, count(*) "count_"

from
person t1 inner join violations t2 on t1.id=t2.person_id
group by 1
) tab