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

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

新規登録して質問してみよう
ただいま回答率
85.50%
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回答

729閲覧

SQLで、交換前後の部品の走行距離の差および交換回数を集計し、カラムに追加したい

chanda-11

総合スコア6

MySQL

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

SQL

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

0グッド

1クリップ

投稿2020/02/28 03:07

MySQLを使用して、車両に使用されるパーツの交換実績および走行距離の計測結果を管理しています。

〇実現したいこと;
同じ「車種」、「車体番号」で使用された部品(「部品番号」)において、前回交換作業時からの「走行距離の差」と「交換回数」を算出しテーブルに追加したい。

※「車種」:文字列型
※「車体番号」:数値型
※「商品番号」:文字列型
※「交換作業日」:date型
※「作業終了時の走行距離」:数値型

■対象のテーブル(tb_before);
イメージ説明

 ■実施したいこと(tb_after);
イメージ説明

〇補足1;
「部品番号」は、「車種」や「車体番号」に関係なく使用されております。※2行名「1d」と6行目「1d」のように
そのため、「車種」、「車体番号」、「部品番号」が共通であり、且つ「交換作業日」の前後関係を見て、「交換回数」と「走行距離の差」を集計し
それをカラムとして追加したいです。

〇補足2;
レコード数は非常に多いテーブルとなっておりまして、なるべくシンプルな計算だと非常にありがたいです。

大変恐縮ですが、アドバイスがありましたらご教授いただけないでしょうか。

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

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

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

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

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

mongolia

2020/02/28 03:33

PHPとかRubyとかプログラミング言語の利用はNGという前提ですか?
chanda-11

2020/02/28 03:42

前提はNGでお願いしたい次第です。SQLのみでは実現不可であれば、プログラミングも検討しようと思っております。
guest

回答2

0

ベストアンサー

「走行距離の差」はlag()関数が用途に適しています。
「交換回数」は相関副問合せ同じくWindow関数のRow_Number()を用いればいいと思います。
~~

レコード数は非常に多いテーブルとなっておりまして、なるべくシンプルな計算だと非常にありがたいです。

多分パフォーマンスを気にされているのだと思いますが、性能については記述が簡潔であれば早いという訳ではありません。
実行計画次第ではチューニングが必要でしょう。

SQL

1SELECT * 2 , ROW_NUMBER() OVER(PARTITION BY 車種, 車体番号, 部品番号 ORDER BY 交換作業日) AS 交換回数 3 , 走行距離- lag(走行距離) OVER(PARTITION BY 車種, 車体番号, 部品番号 ORDER BY 交換作業日) AS 走行距離の差 4FROM tb_before

投稿2020/02/28 03:49

編集2020/02/28 05:45
sazi

総合スコア25138

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

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

chanda-11

2020/02/28 03:58

早速のご回答誠にありがとうございます。 もし、可能でしたら、SQL文をご教授いただけないでしょうか。当方知識が不足しており、併せてご教授いただけると助かります。 申し訳ないです。
chanda-11

2020/02/28 06:22

頂いた内容で希望の動作が確認できました。誠にありがとうございます。非常に助かりました。
guest

0

かなり長々ですが、こんなところでしょうか。
MySQL8以降でサポートされているWINDOW関数を使っています。
当然実際にテーブルを作って試したわけではないので、SELECT部分を十分にテストしてください。

SQL

1INSERT INTO tb_after (交換回数, 走行処理の差) 2SELECT 3 ROW_NUMBER() OVER (PARTITION BY 車種, 車体番号, 部品番号 ORDER BY 交換作業日) AS 交換回数, 4 走行距離 - IFNULL(LAG(走行距離, 1) OVER(PARTITION BY 車種, 車体番号, 部品番号 ORDER BY 交換作業日), 0) AS 走行距離の差 5FROM tb_before

投稿2020/02/28 05:33

編集2020/02/28 05:49
yureighost

総合スコア2183

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

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

chanda-11

2020/02/28 06:23

ご回答いただきまして、ありがとうございます。頂いた内容にて得たい結果が取得できました。 懇切丁寧に教えていただきましたこと、本当に感謝です。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問