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

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

解決済

1回答

793閲覧

MySQL - グループ単位で上位n件を取得するSQL文を作成する過程での質問

aya1

総合スコア11

MySQL

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

SQL

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

0グッド

0クリップ

投稿2019/08/04 10:48

編集2019/08/04 11:03

code毎にグルーピングし、cost_salesが0を除外し、release_atの上位2件を取得するSQL文作成しています。
下記を参考に次のSQLを作りました。

【MySQL】グループ単位で上位n件を取得するSQL文を作成したい。

sql

1SELECT 2 id, code, release_at, cost_sales 3FROM 4 performance as p1 5-- 評価行と同じcodeで、評価行よりrelease_atが新しいものの行数を数えて、それが2以下なら採用する 6WHERE 7 2 >= ( 8 SELECT COUNT(*) 9 FROM (SELECT * FROM performance WHERE cost_sales != 0) as p2 -- ★1 10 -- FROM performance as p2 -- ★2 11 WHERE 12 p1.code = p2.code 13 AND p2.release_at >= p1.release_at 14 ) 15 AND cost_sales != 0 16ORDER BY 17 code, release_at DESC;

★1だと結果は6917件で、★2にすると25件になります。

★1の結果
★1の結果
★2の結果
★2の結果

★1のほうが条件文を挿入しているので件数が少なくなりそうなのですが、実際はその逆になっているところが理解できません。
また、もっとよいSQLがありますでしょうか。

どなたかご教授してくださると嬉しいです。よろしくおねがいします。

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

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

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

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

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

sazi

2019/08/04 14:36

MySQL8.0以降なら集計関数(rankなど)が使えます。
yambejp

2019/08/05 02:22

サンプルがないと答えづらいですがランキング処理自体思いロジックは簡単ですが 重い処理なのでそこそこ面倒です(チューニングのために専用のテーブルで管理したり必要)
guest

回答1

0

ベストアンサー

外側の WHERE の AND cost_sales != 0 を外してみるとわかりやすいと思います。

code = 1301 がこのようになっているとします。

release_atconst_sales
2019-05-13232446
2019-05-10231180
2019-05-200
2019-05-210

★1 は 4件すべて抽出されます。
★2 は 下の2件が抽出されます。

そして、AND cost_sales != 0 をつけると★1 は 2件、★2 は 0件になります、

★1 が要件を満たすならそのままでよさそうです。

投稿2019/08/04 13:17

編集2019/08/04 13:41
KOZ6.0

総合スコア2626

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

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

aya1

2019/08/06 01:49

すごい。まさにその通りの動作になります。 私には、なぜそのような動作になるのかいまいちわかりません。 そもそもWHERE句が何をしているのかがわかっていないので、そこから調べて勉強しようと思います。 こんな私に目を通しておいたほうがいいサイトや書籍などありますでしょうか。 「達人に学ぶSQL」や「反復学習ソフト付きSQL書き方ドリル」など一通り目を通してはいますが、もう一度復習する必要がありそうです。
KOZ6.0

2019/08/06 03:40

うーん、生憎ですが、SQL 本を買って勉強したという覚えがありません。 ただ、書いたSQLを組み替えてみたり、実行計画をとったり、系統別にまとめてみたりして、気づいたことをメモしたりはしています。 あとは、こういうところで相談にあがったものに対してコメントは書かないにしても自分で書いて実行してみるといいのかもしれませんね。
aya1

2019/08/07 10:21

とても参考になります。 ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問