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()
この辺を調べるといいかもしれません