在postgresql中计算每个年龄组的频率

jei2mxaa  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(396)

我有一个如下所示的输入数据

Person_id   Age
21352471    59
22157363    51
22741394    75
22764902    27
22771872    62

我试图计算每个年龄组的发病率(患者数量),如 0-10 , 11-20 , 21-30
你能帮我怎么做吗?
我在网上做了类似的尝试,但这没有帮助

select
  person_id,
  count(*) filter (where age<=10) as "0-10",
  count(*) filter (where age>10 and age<=20) as "11-20",
  count(*) filter (where age>20) as "21-30"
from
  age_table
group by
  person_id;

我希望我的输出如下所示

Age_group  freq
0-10         0
11-20        0
21-30        1
31-40        0
41-50        0
51-60        2
61-70        1
71-80        1
oymdgrw7

oymdgrw71#

你可以试试下面的-

select case when age<=10 then "0-10"
when age>10 and age<=20 then "11-20"
when age>20 and age<=30 then "21-30" end as age_group
count(person_id) as freq
from
  age_table
group by
case when age<=10 then "0-10"
when age>10 and age<=20 then "11-20"
when age>20 and age<=30 then "21-30" end
baubqpgj

baubqpgj2#

下面是一种方法,它将年龄分成10个批次,如下所示

select concat(
        (age/10)*10 
       ,'-'
       ,(age/10)*10+10
        )as age_bracket
      ,count(person_id) as frequency
 from t
group by concat(
        (age/10)*10 
       ,'-'
       ,(age/10)*10+10
        )
order by 1  

+-------------+-----------+
| age_bracket | frequency |
+-------------+-----------+
| 20-30       |         1 |
| 50-60       |         2 |
| 60-70       |         1 |
| 70-80       |         1 |
+-------------+-----------+

D小提琴连杆
https://dbfiddle.uk/?rdbms=postgres_12&fiddle=720d56ae4428a3ddd25ecb5bdac3b7fa

cfh9epnr

cfh9epnr3#

如果你很想显示0-100岁之间的所有年龄段,不管是否有参赛者,这里有另一个答案

with data
  as (select concat(
                   case when x=1 then 0 else (x-1)*10+1 end
                   ,'-'
                   ,x*10
                  ) as ranges
             ,case when x=1 then 0 else (x-1)*10+1 end lv
             ,x*10 as hv
        from generate_series(1,10) x
      ) 
    select d.ranges as age_bracket
          ,count(t.person_id) as frequency
     from data d
left join t 
       on t.age>=d.lv
      and t.age<=d.hv
group by d.ranges 
order by 1

-------------+-----------+
| age_bracket | frequency |
+-------------+-----------+
| 0-10        |         0 |
| 11-20       |         0 |
| 21-30       |         1 |
| 31-40       |         0 |
| 41-50       |         0 |
| 51-60       |         2 |
| 61-70       |         1 |
| 71-80       |         1 |
| 81-90       |         0 |
| 91-100      |         0 |
+-------------+-----------+

db小提琴链接
https://dbfiddle.uk/?rdbms=postgres_12&fiddle=d21a1ef85d017a3d891ec6f85269a381

相关问题