项目中业务需求,需要根据数据库中的出生年月(birthday)和性别(sex)查询人员年龄结构及男女数量和差值统计,先在SQL中试了实现方式,实现如下,大致能统计出来,但是线上的数据库是hbase的,不支持elt、interval的语法,故使用第二种方法:
一、MySQL中实现
SELECT elt(interval((2018-SUBSTR(birthday,1,4)),0,20,30,40,50,60,100),
'less20','20to30','30to40','40to50','50to60','more60') AS age,
COUNT(*) AS counts FROM `tableA`
GROUP BY elt(interval((2018-SUBSTR(birthday,1,4)),0,20,30,40,50,60,100),
'less20','20to30','30to40','40to50','50to60','more60');
查询结果
二、Hbase中实现
注:项目中是使用phoenix来操作Hbase的,详细文档可以看官网:http://phoenix.apache.org/#
SELECT (CASE WHEN age <=20 THEN '20岁以下'
WHEN( age >=21 AND age <=30 )THEN '21-30'
WHEN( age >=31 AND age <=40 )THEN '31-40'
WHEN( age >=41 AND age <=50 )THEN '41-50'
WHEN( age >=51 AND age <=60 )THEN '51-60'
ELSE '60岁以上' END
)AS ages, COUNT(*) AS num, COUNT(CASE WHEN sex='1' THEN '男' END) AS male,
COUNT(CASE WHEN sex='2' THEN '女' END) AS female
FROM (SELECT YEAR(now())-TO_NUMBER(SUBSTR(birthday,1,4)) AS age,
sex FROM tableA WHERE SUBSTR(birthday,1,4) LIKE '3301%')
GROUP BY (CASE
WHEN age <=20 THEN '20岁以下'
WHEN( age >=21 AND age <=30 )THEN '21-30'
WHEN( age >=31 AND age <=40 )THEN '31-40'
WHEN( age >=41 AND age <=50 )THEN '41-50'
WHEN( age >=51 AND age <=60 )THEN '51-60'
ELSE '60岁以上' END
)