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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

4257閲覧

SQL文について(GROUP BY句, HAVING句など)

HatenaSugar

総合スコア7

MySQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

1グッド

0クリップ

投稿2017/06/03 14:24

HatenaSugarと申します.
SQL文について伺いたいことがありましたので投稿させていただきました.
よろしくお願い致します.

以下の様なテーブルがあるとします.
イメージ説明

このうち,「日付」カラムごとに分類して,そのうち「修正」カラムが最大値をとる行を取得したいと思っています.
イメージ説明

取り出した後のテーブルのイメージが今のようになります.
イメージ説明

そこで,私は以下の様なSQL文を書きました.
String sql = SELECT * FROM table WHERE 'ID'=1111
GROUP BY '日付' HAVING '修正'=MAX('修正')";

しかし,このSQLだと「20170202」と「20170404」の行しか取得されませんでした.
この他にもSQL文を書きましたが,エラーを出さずに希望する結果に最も近いSQL文が上記のもの
でした.

そこで,皆さんにSQL文の書き方のご教授を頂きたく思います.
お返事いただけると幸いです.
お忙しいところ申し訳ございませんがよろしくお願い致します.

KiyoshiMotoki👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

そのSQLだとエラーになると思いますが。

table は予約語なのでそのままではエラーになる。
GROUP BY がある場合は、* は使えない。
フィールド名を'シングルクォーテーションで囲んだらあかん。
など。

下記の考え方で。
GROUP BY を使って ID, 日付 毎の修正の最大を取得する。
それと元のテーブルを内部結合する。

SQL

1SELECT a.* FROM 2 `table` a INNER JOIN (SELECT ID, 日付, MAX(修正) AS MAX_修正 FROM `table` GROUP BY ID, 日付) b 3 ON a.ID = b.ID AND a.日付=b.日付 AND a.修正 = b.MAX_修正;

動作確認サンプル
(MySQL) | ブラウザでプログラミング・実行ができる「オンライン実行環境」| paiza.IO

投稿2017/06/03 15:22

hatena19

総合スコア33715

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

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

HatenaSugar

2017/06/03 18:50

hatena19さん. ご回答ありがとうございました. 「INNER JOIN」を参考に目的の結果を出すことができました. また,おっしゃる通り「GROUP BY句」でまとめるときには「ID」と「日付」の両方で行う方がより良いことであると私も思います. この度はご回答誠にありがとうございました.
A.Ichi

2017/06/04 01:02

in()の対象件数が大量の場合は、JOINの方が速度的に良いと思います。
guest

0

havingではありませんが
mysqlの場合groupキー以外の項目(集合関数以外)は、どれを持って来るか保障されていないのでは
またHAVING区の条件は、グループで成立するので 修正=max(修正)は2件になります。

sql

1select * from table where (`id`,`日付`,`修正`) in ( 2 select `id`,`日付`,max(`修正`) from table where `id`=1111 group by `日付`);

投稿2017/06/03 15:17

編集2017/06/03 16:48
A.Ichi

総合スコア4070

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

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

HatenaSugar

2017/06/03 18:57

A.Ichiさん. ご回答ありがとうございます. INNER JOINを用いた方法によって目的の結果が出ましたので,一先ずそちらを採用致しました. しかし,頂いたご回答の「IN句」を用いる方法は考えつきませんでした. IN句での方法で可能かどうかの検証をさせて頂きたいと思います. この度は貴重なご意見誠にありがとうございました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問