😀

Hiveでアルファベット+数字の並び替えを行う方法

2021/06/15に公開

状況

以下のデータを、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
GitHubで編集を提案

Discussion