【SQL】分组多条件查询MySQL和Hbase中的实现

项目中业务需求,需要根据数据库中的出生年月(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');

查询结果
MySQL

二、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
)

Hbase

猜你喜欢

转载自blog.csdn.net/tian330726/article/details/80715597