@kyanny's blog

My life. Opinions are my own.

SQL で、 GROUP BY で集約されるときのソート順序を変えられるのだろうか

たぶん変えられるんだけどやり方を知らないのでダサイ方法で乗り切った。

こんなテーブルがあって、

mysql> SELECT * FROM population;
+------+-------+------------+-----------------+------------+
| year | month | prefecture | city            | population |
+------+-------+------------+-----------------+------------+
| 2008 |    12 | 埼玉県  | さいたま市 |    1201819 | 
| 2008 |    12 | 埼玉県  | 上尾市       |     222973 | 
| 2008 |    12 | 埼玉県  | 川越市       |     337996 | 
| 2008 |    11 | 埼玉県  | さいたま市 |    1201455 | 
| 2008 |    11 | 埼玉県  | 上尾市       |     222966 | 
| 2008 |    11 | 埼玉県  | 川越市       |     337844 | 
| 2008 |    10 | 埼玉県  | さいたま市 |    1200739 | 
| 2008 |    11 | 埼玉県  | 上尾市       |     222915 | 
| 2008 |    11 | 埼玉県  | 川越市       |     337532 | 
+------+-------+------------+-----------------+------------+

GROUP BY してこういう結果になるが、

mysql> SELECT * FROM population GROUP BY prefecture, city;
+------+-------+------------+-----------------+------------+
| year | month | prefecture | city            | population |
+------+-------+------------+-----------------+------------+
| 2008 |    12 | 埼玉県  | さいたま市 |    1201819 | 
| 2008 |    12 | 埼玉県  | 川越市       |     337996 | 
| 2008 |    12 | 埼玉県  | 上尾市       |     222973 | 
+------+-------+------------+-----------------+------------+

この結果を、今は population の値が一番大きいレコードが集約結果として表示されているが、例えば population が一番小さいレコードが表示されていて欲しい、とか。このテーブルのケースで、 SQL 一発で一番小さい population の値が欲しい。HAVING 句を付け足してみたりしたがどうもうまくいかず、

mysql> SELECT year, month, prefecture, city, MIN(population) AS population FROM population GROUP BY prefecture, city;
+------+-------+------------+-----------------+------------+
| year | month | prefecture | city            | population |
+------+-------+------------+-----------------+------------+
| 2008 |    12 | 埼玉県  | さいたま市 |    1200739 | 
| 2008 |    12 | 埼玉県  | 川越市       |     337532 | 
| 2008 |    12 | 埼玉県  | 上尾市       |     222915 | 
+------+-------+------------+-----------------+------------+

SELECT 句に MIN(population) を書いた。お茶を濁したというか、なんか違う気がしている。偽造されたレコード、というか。 population の値(実際には別のテーブルのプライマリキーなカラムを参照してる)だけしか必要ないからこれでも用事は済ませることができたけど・・・。