组的postgresql平均值(计数)
我有两张桌子,一个人和一个人。Person表由以下列组成:id、name、DOB和while 违规表:违规id、人员id (违规id不是密钥,因为事件可能涉及多人。) 我想找出每个年龄组的平均违规数量:18-40、41-65和66岁以上。因此,这是我第一次尝试为每个组返回相同的结果。有人能指导我解决这个问题吗?先谢谢你组的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
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