sql - 组的 postgresql avg(count)
问题描述
我有 2 张桌子,人员和违规行为。人员表由以下列组成:id,name,DOB 而违规表:违规表:违规ID,人员ID。
(Violation_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 岁以下。
如果您想要每组中所有违规的比例(这不是“平均值”),那么您只需使用窗口函数:
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(*),
count(*) * 1.0 / sum(count(*)) over ()
from violations v join
persons p
using (person_id)
group by age_category ;
推荐阅读
- c++ - ostream << 重载和编译时确定的函数返回类型的问题
- google-api - Google Drive API:一次列出所有文件
- php - PHP:将变量放入变量中,或编辑变量
- javascript - CKEditor ckfinder 标头在反应 js 中不起作用
- phpstorm - 如何关闭所有项目或 1 个文件的自动对齐?
- html - 内联 CSS 有效,但为什么不能使用外部 CSS?
- android - 用于过滤支付发送应用程序的意图过滤器
- mps - JetBrains 元编程系统不工作
- paperjs - 克隆和符号有什么区别
- amazon-web-services - 如何仅为 AWS Glue 脚本启用粘合日志记录