😀
Hiveでアルファベット+数字の並び替えを行う方法
状況
以下のデータを、categoryカラムの中のアルファベット順で並び替えてから、続く数字で並び替えたい(idはint、categoryはstring)。
id | category |
---|---|
1 | a2 |
2 | b5 |
3 | a13 |
4 | b2 |
5 | a1 |
最初に書いたクエリ
select
category
from
table
order by
category
結果は以下のとおり。
文字列として並び替えるため、a13がa2より先に来てしまうよう。
category |
---|
a1 |
a13 |
a2 |
b2 |
b5 |
上手く動いたクエリ
select
category
from
table
order by
regexp_extract(category, "([a-zA-Z]+)", 1),
cast(regexp_extract(category, "([0-9]+)", 1) as int)
まず、categoryからアルファベットだけを抜き出してアルファベット順に並べかえる。
その上で、categoryから数字だけを抜き出して数字順に並び替えればOK。
このとき、数字を文字列型から数値型に変換してあげないと上手く並び替えてくれないので注意する。
※ ちなみに、今回はregexp_extract関数を使ったが、文字数が決まっているのであればsubstr関数などでもよさそう。
結果は以下のとおり。
category |
---|
a1 |
a2 |
a13 |
b2 |
b5 |
Discussion