結合テーブルから集約値と同時に代表値を取得する

集約関数を使用した結合テーブルの、集約される側のテーブルのフィールド値は、集約関数を通してしか取得することができない。

が、どのフィールドでもいいから集約される側のテーブルの文字列フィールドの値を持ってきたい場合があって、こんな感じで解決した。

5行目のdiary.titleは文字列なわけだけど、max関数に渡すことで集約される側のテーブルから代表値を取得しているような状態。

1人のpersonが「はじめまして」と「今日はいい天気だった」と「今日はぶん殴られた」の3つのdiary.titleを書いていた場合に、このうちの代表値としてdiary_titleは「今日はぶん殴られた」が取得される。

 

max(文字列)は、文字の長さではなくて先頭文字から文字コードを比較して文字コードが大きいものを返すから、「は」と「今」では「今」のほうが文字コードが大きく、「今日はい」と「今日はぶ」では、「い」より「ぶ」のほうが文字コードが大きいからmax(diary.title)では「今日はぶん殴られた」が返る。

逆にmin(diary.title)とすれば、「はじめまして」が返る。

(Postgresqlで確認。他のSQLは未確認。)

 

文字列を集約関数ごしに取得する必要性に迫られるケースって、かなりのレアケースだと思うけど・・

私の場合は上述のようなSQLをビューとして定義して、高度な検索クエリを作成する際に結合して利用した。

コメントを残す

トラックバック: http://pgnote.net/wp-trackback.php?p=2608