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

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

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

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

解決済

4回答

2694閲覧

効率の良いsql文

takagi.1994

総合スコア47

MySQL

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

0クリップ

投稿2016/05/18 05:31

CREATE TABLE table (
cd int(11) NOT NULL,
date datetime NOT NULL,
value double NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

ALTER TABLE table
ADD PRIMARY KEY (cd),
ADD UNIQUE KEY date (date,value);

ALTER TABLE table
MODIFY cd int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=844117;

INSERT INTO table (cd, date, value) VALUES
(88, '2015-12-01 08:06:22', 123.1719),
(89, '2015-12-01 08:06:24', 123.1693),
(90, '2015-12-01 08:06:26', 123.17,),
(91, '2015-12-01 08:06:27', 123.1692),
(92, '2015-12-01 08:06:29', 123.17),
(93, '2015-12-01 08:06:30', 123.1693),
(94, '2015-12-01 08:06:31', 123.1717),
(95, '2015-12-01 08:06:32', 123.1721);

上記のtableに対してそれぞれ分単位で
その分の最終値のvalue
その分の最初値のvalue
その分の最大値のvalue
その分の最小値のvalue
を取得したいのですが一発でいけるのでしょうか?

また、tableには常にデータが入ってきているので、定期的にこれらを取得してtable2へ挿入していきたいと考えています。
この場合、ストアドプロシージャーで定期的に実行させたいと考えていますが、ほかによいアイデアなどがありますでしょうか?

ちなみに、tableのデータに対してupdateは行われないので、過去のデータが変更になることはありません。

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

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

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

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

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

guest

回答4

0

ベストアンサー

テーブル名やカラム名に予約語は使わないでいただきたい。

sql

1SELECT 2 DATE_FORMAT(A.`date`, '%Y-%m-%d %H:%i') AS `dt` 3 , SUBSTRING_INDEX( GROUP_CONCAT(CAST(`value` AS CHAR) ORDER BY `date`), ',', 1 ) AS `first` 4 , SUBSTRING_INDEX( GROUP_CONCAT(CAST(`value` AS CHAR) ORDER BY `date` DESC), ',', 1 ) AS `last` 5 , min(A.`VALUE`) AS `min` 6 , max(A.`VALUE`) AS `max` 7FROM 8 `sample` A 9GROUP BY 10 DATE_FORMAT(A.`DATE`, '%Y-%m-%d %H:%i')

投稿2016/05/18 05:46

編集2016/05/18 07:29
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2016/05/18 07:29

修正しておきましたー
takagi.1994

2016/05/24 13:59

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

0

tableには常にデータが入ってきているので、定期的にこれらを取得してtable2へ挿入していきたいと考えています。

トリガーが使えるようでしたら検討してみてください。

投稿2016/05/18 05:58

ttyp03

総合スコア16998

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

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

Koozy

2016/05/18 07:17

MariaDBはわかりませんがMySQLは文トリガなので今回の集計には向かない気がしますね。
guest

0

ローソク足グラフの作成ですね。
SQL問い合わせではスマートに取れないので、SELECT文で工夫するよりは分足を表現するテーブルを別に作る方がよろしいかと思います。
分足テーブルは日時分が主キーで first, max, min, last のカラムを持つようなテーブルで、
メインテーブルに挿入する際には必ず同時にこちらにも書き込みます。
INSERT...ON DUPLICATE KEY UPDATE
命令が役に立つかと思います。

投稿2016/05/18 05:47

yuba

総合スコア5568

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

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

0

例示のINSERT文だと以下の結果を取得するイメージで良いでしょうか?
その分の最終値のvalue : 2015/12/1 08:06における時系列で最後の値である123.1721
その分の最初値のvalue : 2015/12/1 08:06における時系列で最初の値である123.1719
その分の最大値のvalue : 2015/12/1 08:06の最大の値である123.1721
その分の最小値のvalue : 2015/12/1 08:06の最小の値である123.1692

GROUP BYとHAVINGを使ったややコストの高いSQLになりますが一発で取得することは可能ですね。

ストプロですとMySQLはテーブルにロックが掛かったような気がします(うろ覚え)。
その際、「tableには常にデータが入ってきているので」というのと競合しそうで気になります。

投稿2016/05/18 05:46

Koozy

総合スコア55

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問