joinしたりwhereしたあとの最頻値が欲しかった
INNER JOINしたあとのテーブルの最頻値(一番多く出る値)が必要になったので使い方わからないhavingについて調べました。
最初MAX出でるかと思ったけどあれは最大値であって最頻値ではないんですね…。文字列の最頻値が欲しかったので謎の結果が出て修正しました。
joinなりwhereなりで絞った後のが下記のような感じで、最頻値の文字列Aという文字だけが欲しかった。
(イメージです、テーブルの内容は省略しています)
|table1.etc_id|table2.etc_id|table3.etc_id|table3.get_max_column| ----------------------------------------------------------------- | 1| 1| 1| 文字列A| | 2| 2| 2| 文字列A| | 3| 3| 3| 文字列B|
下記のSQLの実行結果はこんな感じ(イメージです)
|table3.get_max_column| ---------------------- | 文字列A|
同じSQLを二回書くのは同じテーブルを流用できないから、同じテーブル用意してそこにたいして検索かけるからなのかなと思っています。
でも、省略して書いてた人がいた気がするので別の方法あるのかな。
なにかいい手段あったら教えてほしいです
# 最頻値を出したいカラム、今回は table3.get_max_column とした SELECT table3.get_max_column #集計したいjoinしたテーブル FROM table1 INNER JOIN table2 ON table1.etc_id = table2.etc_id INNER JOIN table3 ON table1.etc_id = table3.etc_id WHERE table3.where_column = '適当にwhereしたい値' #集計したいjoinしたテーブルここまで # 最頻値を出したいカラムをGROUP BYのあとに書いておく GROUP BY table3.get_max_column HAVING COUNT(*) >= ALL ( SELECT COUNT(*) # 上の集計したいテーブルと同じSQL FROM table1 INNER JOIN table2 ON table1.etc_id = table2.etc_id INNER JOIN table3 ON table1.etc_id = table3.etc_id WHERE table3.where_column = '適当にwhereしたい値' # 上の集計したいテーブルと同じSQLここまで # ここにも最頻値を出したいカラムをGROUP BYのあとに書いておく GROUP BY table3.get_max_column);
SQLのコメントってそういえばあまり書く人見かけないですね…、なんかあるのかな。