質問: SQLに不慣れで使いだしたばかりなので初歩的なものかと思いますが、よろしくお願いします。 ### 前提・実現したいこと 下記のようなテーブル(AABB)があります。 | AA | BB | | --- | --- | | a | 1 | | a | 2 | | a | 3 | | a | 1 | | a | 2 | | b | 1 | | b | 3 | | b | 2 | | b | 3 | | b | 4 | これをSQLでどうにかして、 | AA | BB | max | | --- | --- | --- | | a | 1 | 2 | | a | 2 | 2 | | b | 3 | 2 | というような結果を出したいです。 つまり、AAごとにBBが何個あるのかカウントし、一番多かったBBの値とその個数を、複数個ある場合は複数個返したいです。 ### 試したこと ``` select AA, max(a.count) as max from ( select AA, BB, count(BB)as count from AABB group by AA, BB ) a group by a.AA order by AA; ``` 上記のSQL文でMAXやCOUNTを使ってAAごとに何個ある、というものまでは出来たのですが、 GROUP BYで行っているため、AAごとに実行しようとすると複数個あった場合でも1つになってしまいます。 | AA | max | | --- | --- | | a | 2 | | b | 3 | また、BBの表示もできず...selectに入れてもBBごとにmaxが表示されるだけで、私でも違うと分かりました。 複数個ならWHERE句を使うというのも見かけましたが、どう使えばうまくいくのか分からず エラーばかり出て迷走しております... 初歩的かと思いますが、教えてくださいませ。 よろしくお願いします。
回答: たいへん申し訳ないのですが、一つ見落としていたカラムを発見しました。 そもそもの考え方が異なっており、AAとBBとは別のCC(仮)もセットで一意のものとなっていました。 ``` select AA, BB, max(cnt) from (select AA, BB, count(*) as cnt from (select AA, CC, BB from TABLE) group by AA,BB ) group by AA,BB order by AA ``` 早とちりで色々とミスが発覚しているので、解決済から下げさせていただきました。 ご迷惑をおかけして申し訳ありません。 (追記) どうやらSAP hanaのSQL動作が普通のものとは異なっていたようです。 実際にSAPhanaで実行したかったSQLはポスグレなどだとほんの数行で終わるようです。 私の環境ではそうはいかなかったので、解決した方法を記載しておきます。 上に書いてあるCCも使用しました。 SAPhanaを使用している方は参考にしてください(長いです)。 ``` WITH tb AS( SELECT AA, BB, count(*) AS cnt FROM ( SELECT AA, BB, CC FROM TABLE ) GROUP BY AA, BB ), cntTb AS( SELECT AA, max(cnt) AS maxcnt FROM tb GROUP BY AA ) SELECT cntTb.AA, BB, maxcnt FROM cntTb INNER JOIN tb ON cntTb.AA = tb.AA AND cntTb.maxcnt = tb.cnt ORDER BY 3 DESC, 1, 2 ```