SQL グループ(GROUP BY)毎にソート順を振りたい時 (oracle)

注:oracle環境でのお話です。

ループ化したのはいいけども、ソート順がめちゃくちゃになってしまった!
どうしてもグループ結果をソートしなくちゃならない!
時に読んでください。


まずこんなテーブルがあったとします。

ID グループ名 行先 グループ名ソート順
01 たぬき 東京 04
02 かめ 東京 02
03 うさぎ 大阪 03
04 きつね 大阪 01
05 ごりら 沖縄 05
やりたい事

・同じ行先でまとめる。(GROUP BY)
・同じ行先を持つグループ名はカンマ区切りでまとめる。(LISTAGG())
・グループ名を連結する際にグループ名ソート順を使用。
・行先毎にソート順を振る。(同じ行先内で最も小さなグループ名ソート順を使用)
↓こんな感じにしたい↓

グループ名 行先 ソート順
きつね、うさぎ 大阪 01
かめ、たぬき 東京 02
ごりら 沖縄 05
そんな時のコード
SELECT
	LISTAGG(TBL1.グループ名,',') WITHIN GROUP (ORDER BY TBL1.グループ名ソート順) AS グループ名
	,TBL1.行先 AS 行先
	,MIN(TBL1.グループ名ソート順) AS ソート順
FROM
	TBL1
GROUP BY TBL1.行先
解説

元々持っていたソート順を、グループ化後も引き継ぎたい時
グループ化した結果はソート順を保証しません(暗黙的に勝手にソートされます)ので、手を加えてやる必要があります。
グループ化前に持っていたソート順はそのままでは使用できませんので、MIN()を使用し、グループ内で最も小さなソート順を取得しています。

その他

この例とは違う形で連番が振りたいよという場合
・DENSE_RANK()
・ROW_NUM()
この辺を調べるといいかもしれません

一言

SQL側でデータの成型をするのって、どうも面倒に感じるんですけどどうでしょう。
あまりよく知りませんけども。

・・・

以上!