質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

1回答

699閲覧

MySQLにてグループの平均や最大が知りたい

nanamin

総合スコア27

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2017/11/04 22:33

編集2017/11/04 23:53

###前提・実現したいこと
グループごとに存在するスコアがあり、グループごとの最大や直近のスコアの平均を知りたいと考えています。

###該当のソースコード

MySQL

1id,user_id,group,group_num,score 21,1,1,10,85 32,1,1,10,5 43,1,1,10,50 54,2,1,11,93 65,2,1,11,79 76,3,1,12,13 87,4,1,13,32 98,4,1,13,94 109,4,1,13,31 1110,5,2,10,5 1211,5,2,10,6 1312,5,2,10,69 1413,6,2,11,87 15

###意図する結果
最大
group1
85点のフィールドと93点のフィールドと13点のフィールドと94点のフィールドを取得

直近の平均
グループ1の場合、50+79+13+31の各フィールドを取得したり、その平均を求める。idが大きいものが直近になります。

###質問
やはり、クエリを何回もなげて、取得するべきでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SVC34

2017/11/04 23:03

どのカラムでグルーピングするのか、何をもって「直近」と判断するのかよくわからないので明示してください。
nanamin

2017/11/04 23:51

groupカラムでグルーピングします。直近というのは、日付ですね。データが挿入されていくので、idが大きいものが最新になります。あ、間違えました。idをつけておくの忘れました。。。
SVC34

2017/11/05 00:11

groupカラムは2種類しかないですが、groupとgroup_numの2つでグルーピングしたい、もしくは特定のgroupにおいてgroup_numでグルーピングしたいということでしょうか。
nanamin

2017/11/05 00:36

カラムの設計が分かりにくくてすみません。groupはクラス、group_numは出席番号的なイメージです。クラスごとの最大や平均を知りたいということです。
guest

回答1

0

ベストアンサー

ご希望のことは、下記のような感じでしょうか。

最大

group, user_id 毎の最大

SQL

1SELECT t1.group, MAX(t1.score) As MAX_score 2FROM `t1` 3GROUP BY t1.group, t1.user_id;

出力結果
| group | MAX_score |
|-------|-----------|
| 1 | 85 |
| 1 | 93 |
| 1 | 13 |
| 1 | 94 |
| 2 | 69 |
| 2 | 87 |

直近の平均

group, user_id 毎の直近(id最大)の score

SQL

1 SELECT a.group, a.score 2 FROM `t1` a 3 INNER JOIN ( 4 SELECT id, MAX(id) As Max_id 5 FROM `t1` 6 GROUP BY t1.group, t1.user_id 7 ) b ON a.id = b.Max_id 8

出力結果
| group | score |
|-------|-------|
| 1 | 50 |
| 1 | 79 |
| 1 | 13 |
| 1 | 31 |
| 2 | 69 |
| 2 | 87 |

上記の平均

SQL

1 SELECT a.group, Avg(a.score) AS Avg_score 2 FROM `t1` a 3 INNER JOIN ( 4 SELECT id, MAX(id) As Max_id 5 FROM `t1` 6 GROUP BY t1.group, t1.user_id 7 ) b ON a.id = b.Max_id 8 GROUP BY a.group

出力結果
| group | Avg_score |
|-------|-----------|
| 1 | 43.25 |
| 2 | 78 |

サンプルURL

SQL Fiddle

投稿2017/11/05 00:34

編集2017/11/05 00:36
hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nanamin

2017/11/05 08:29

なるほど。innter joinというのがあるのですね。参考になりました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問