/*SQLのお勉強、グループごとにある最大値の行を取得する
参考サイト
https://qiita.com/nogitsune413/items/f413268d01b4ea2394b1
考え方は、グループの中で最大を取得する。しかしこのテーブルだけでは、
他の情報氏名が得られないので、もとのテーブルとINNERJOINをして得る
つまり2段階方式
SQLで困るのは、C言語のようにフロー的な考え方ではなくて、
まとまった捉え方で出力される。
C言語のプログラム開発に慣れた人がSQLでクエリを書こうとすると
わからなくなるのはループ的な考え方が全く違うからだ。
クエリでは、処理を内部で全部実行してくれるが、C言語は自分で全部
処理する必要があるのでそのギャップがあって、クエリを作るときに
わからなくなってしまう。
でもクエリとストアドプロシジャを勉強してみてわかったのは
DB関連は、クエリとストアドプロシジャでがんばって書いたほうが効率がよい。
無理にC言語やJAVAでデータを配列にするよりもずっと早いし、修正が楽。
たぶんこれは、実際に経験しないとわからないと思う。
特に、複数の言語を勉強していない人にとってはできるだけ労力をかけずに1つの言語を
深く掘り下げようとするから。
でもDBに関しては、その道の言語を深く掘り下げたほうが効率が良いと思う。
ストアドプロシジャを2年ほど勉強しているおっさんの独り言だった。
*/
–基本的な考え方として、グループの中で最大値を出力する。しかし誰かはわからない
元データ
1 2 3 4 5 6 |
Name Age City 坂本 19 東京 中原 50 大阪 山岡 6 東京 赤橋 42 北海道 西 69 大阪 |
1 2 |
SELECT TOP 10 City,max(age) as MaxAge FROM Member Group BY City |
これだと氏名がわからないので誰かわからない。
1 2 3 4 |
City MaxAge 大阪 69 東京 19 北海道 42 |
–グループごとにある最大値の行を取得する
1 2 3 4 5 6 7 8 9 |
SELECT TOP 10 Member.City,Member.Name,Member.Age FROM Member INNER JOIN ( SELECT TOP 10 City,max(age) as MaxAge FROM Member Group BY City ) as memberB ON Member.City = memberB.City--都市名が同じ Where member.age = memberB.MaxAge--最大年齢と一致 ORDER BY AGE DESC |
1 2 3 4 5 |
結果 City Name Age 大阪 西 69 北海道 赤橋 42 東京 坂本 19 |