仕事中の問題と解決メモ。

最近はPythonとGoogle Cloud Platformがメイン。株式会社ビズオーシャンで企画と開発運用、データ活用とか。https://github.com/uyamazak/

BigQuery(Legacy SQL)で年齢を5歳刻みにして取得する

Cloud Datastudioで年代別に処理をする際、下記のように年齢を5刻みのにして出しているのがあって、もっと短くしたくなったのでやってみた。

SELECT
case  
when age>= 10 and age < 15 then '10-14' 
when age>= 15 and age < 20 then '15-19' 
when age>= 20 and age <25 then '20-24' 
when age>= 25 and age <30 then '25-29' 
when age>= 30 and age <35 then '30-34' 
when age>= 35 and age <40 then '35-39' 
when age>= 40 and age <45 then '40-44' 
when age>= 45 and age <50 then '45-49' 
when age>= 50 and age <55 then '50-54' 
when age>= 55 and age <60 then '55-59' 
when age>= 60 and age <65 then '60-64' 
when age>= 65 and age <70 then '65-69' 
when age>= 70 and age <75 then '70-74' 
when age>= 75 and age <80 then '75-79' 
when age>= 80 and age <85 then '80-84' 
when age>= 85 and age <90 then '85-89' 
when age>= 90 and age <95 then '90-94' 
when age>= 95 and age <100 then '95-99' 
else 'その他' end as ages
FROM
  member
SELECT
  age,
  INTEGER(FLOOR(age/5) * 5) as age1,
  CONCAT( STRING(INTEGER(FLOOR(age/5) * 5 )), '-', STRING(INTEGER(FLOOR(age/5) * 5 ) + 4 )) as age2
FROM
  member
LIMIT
  1000

〇歳以上●歳以下の表示がちょっとてこずったけど、できてみるとシンプルだった。

Row	age	age1	age2	 
1	56	55	55-59	 
2	36	35	35-39	 
3	47	45	45-49	 
4	52	50	50-54	 
5	40	40	40-44	 
6	60	60	60-64	 
7	47	45	45-49	 
8	47	45	45-49	 
9	47	45	45-49	 
10	47	45	45-49	 

20代、30代のような10歳刻みであれば10で割って、floorして、10倍するだけでできる

SELECT
  age,
  FLOOR(age/10) * 10,
  CONCAT(STRING(INTEGER(FLOOR(age/10) * 10)), "代")
FROM
  member
LIMIT
  1000
Row	age	f0_	f1_	 
1	56	50.0	50代	 
2	36	30.0	30代	 
3	47	40.0	40代	 
4	52	50.0	50代	 
5	40	40.0	40代	 
6	60	60.0	60代