はてなブックマーク - nihenのブックマーク / 2009年1月24日, SQL で、 GROUP BY で集約されるときのソート順序を変えられるのだろうか - 刺身☆ブーメランのはてなダイアリー など、ツッコミをしていただいたが、「自分の理解が間違っているらしいことは雰囲気からわかるんだけどどこがどう間違ってるのかがわからない」状態。
SQL の GROUP BY とか集約関数について、 MySQL と標準 SQL の仕様の違いも含めて勉強する必要があるな・・・。
(1) where 句で結果の集合がひとつできる -> (2) group by でいくつかの集合にわけられる -> (3) それぞれの集合にはそれぞれ何行かずつのレコードが含まれるが、コマンドラインから sql を実行して結果として表示されるのは各グループにつき一行ずつで、その一行が、 mysql とかのほうで適当に選んだのじゃなくて任意の(たとえば人口カラムの値が一番でかい/小さい)行が最終的に表示されていて欲しい、そういうことは出来ないのかな、ということを書いたつもりだったけど、もしかしたら group by でわけられた集合っていうのは行の概念とかがすでにないもので、 (3) で思ったことの前提になってる「それぞれの集合には何行かずつのレコードが含まれ・・・」っていうのがそもそも間違っているのかな、と思った。
それぞれ population カラムの値が違う(prefecture と city カラムの値は同じ)何行かのレコード、とかいうのじゃなくて、「prefecture が埼玉県で city がさいたま市という属性をもつひとつの不可分なモノ」だということ?(つまりそれ以外の population カラムの値とかはまったく無意味で、だから mysql の仕様のほうが気持ち悪い、となるのかな?本来結果に表示されるべきじゃないものが表示されちゃってるのはヘンだ、という意味で)
だとすると、先の例で「各県、各市ごとの、もっとも人口が少なかった年と月を求めよ」と言われたとしたら(そしてデータがもっといっぱいあったら)どうやるのが正しいやり方なんだろう。やっぱり集合に対して操作をしたいわけだから having 句なのかな・・・。