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

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

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

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

Q&A

解決済

2回答

918閲覧

MySQLでの検索条件について

miya71ma

総合スコア49

MySQL

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

0グッド

0クリップ

投稿2019/06/28 06:18

編集2019/07/01 00:44

MysqlCreateInsert

1CREATE TABLE db1( 2SC int(4) NOT NULL, 3todays_close double, 4ago_close double, 5volume double, 6`Date` datetime NOT NULL 7); 8 9insert into db1 values 10(1000,100,90,900,'2019-06-27 15:00:00'), 11(1000,91,87,100,'2019-06-26 15:00:00'), 12(1000,88,87,500,'2019-06-25 15:00:00'), 13(1000,87,81,400,'2019-06-24 15:00:00'), 14(1000,80,76,600,'2019-06-21 15:00:00'), 15(1000,79,73,200,'2019-06-20 15:00:00'), 16(1000,73,72,100,'2019-06-19 15:00:00'), 17(1000,72,71,200,'2019-06-18 15:00:00'), 18(2000,100,90,300,'2019-06-27 15:00:00'), 19(2000,90,93,300,'2019-06-26 15:00:00'), 20(2000,93,90,500,'2019-06-25 15:00:00'), 21(2000,90,64,300,'2019-06-24 15:00:00'), 22(2000,63,78,100,'2019-06-21 15:00:00'), 23(2000,78,75,200,'2019-06-20 15:00:00'), 24(2000,75,84,300,'2019-06-19 15:00:00'), 25(2000,81,73,400,'2019-06-18 15:00:00'), 26(3000,90,100,900,'2019-06-27 15:00:00'), 27(3000,100,90,900,'2019-06-26 15:00:00'), 28(3000,90,100,900,'2019-06-25 15:00:00'), 29(3000,100,90,900,'2019-06-24 15:00:00'), 30(3000,90,100,900,'2019-06-21 15:00:00'); 31(3000,90,88,100,'2019-06-20 15:00:00'), 32(3000,87,81,300,'2019-06-19 15:00:00'), 33(3000,81,76,200,'2019-06-18 15:00:00'),

#Database内

SCtodays_closeago_closevolumedate
1000100909002019-06-27 15:00:00
100091871002019-06-26 15:00:00
100088875002019-06-25 15:00:00
100087814002019-06-24 15:00:00
100080766002019-06-21 15:00:00
100079732002019-06-20 15:00:00
100073721002019-06-19 15:00:00
100072712002019-06-18 15:00:00
2000100903002019-06-27 15:00:00
200090933002019-06-26 15:00:00
200093901002019-06-25 15:00:00
200090643002019-06-24 15:00:00
200063785002019-06-21 15:00:00
200078752002019-06-20 15:00:00
200075813002019-06-19 15:00:00
200081734002019-06-18 15:00:00
30009010010002019-06-27 15:00:00
3000100904002019-06-26 15:00:00
3000901002002019-06-25 15:00:00
3000100901002019-06-24 15:00:00
3000901002002019-06-21 15:00:00
300090881002019-06-20 15:00:00
300087813002019-06-19 15:00:00
300081762002019-06-18 15:00:00

として過去n日の平均出来高がx%以上であるを検索したい nは土日を除く1日を指すとする
ex.)n=4,x>1(100%より大きい)

MySQL

1SELECT 2 SC,volume,(SELECT avg(volume) from db1 WHERE SC=t1.SC AND date BETWEEN '2019-06-24 15:00:00' AND '2019-06-27 15:00:00') as av,volume/(SELECT avg(volume) from db1 WHERE SC=t1.SC AND date BETWEEN '2019-06-24 15:00:00' AND '2019-06-27 15:00:00') as av_per 3from db1 as t1 4WHERE not exists(SELECT 1 from db1 WHERE SC=t1.SC and Date>t1.date)

で平均は出せるのですがX%以上というのをどのように検索条件に反映させればいいのでしょうか
##想定出力結果

SCvolumeavav_perdate
10009004751.892019-06-27 15:00:00
300010004252.352019-06-27 15:00:00

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

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

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

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

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

m.ts10806

2019/06/28 06:24

PHPではなくMySQLでは。 formatもMySQLの話では?タグとタイトル調整願います。
miya71ma

2019/06/28 06:27

ブラウザバックして戻ってしまっていました。すみません
guest

回答2

0

ベストアンサー

n日があいまい
24日→21日が22,23日を飛ばして1日とするかどうかで全然違う

selectの中でlimitを利用した集計をするのもよくない

調整

  • テーブル作成

テーブルにdbという名前をつけるのはよくないのでtblに変更しておきます
設計上Dateにインデックスを貼ります

SQL

1CREATE TABLE tbl( 2pid int primary key auto_increment, 3SC int(4) NOT NULL, 4todays_close double, 5ago_close double, 6volume double, 7`Date` datetime NOT NULL, 8index(Date) 9); 10insert into tbl(SC,todays_close,ago_close,volume,Date) values 11(1000,100,90,900,'2019-06-27 15:00:00'), 12(1000,91,87,100,'2019-06-26 15:00:00'), 13(1000,88,87,500,'2019-06-25 15:00:00'), 14(1000,87,81,400,'2019-06-24 15:00:00'), 15(1000,80,76,600,'2019-06-21 15:00:00'), 16(1000,79,73,200,'2019-06-20 15:00:00'), 17(1000,73,72,100,'2019-06-19 15:00:00'), 18(1000,72,71,200,'2019-06-18 15:00:00'), 19(2000,100,90,300,'2019-06-27 15:00:00'), 20(2000,90,93,300,'2019-06-26 15:00:00'), 21(2000,93,90,500,'2019-06-25 15:00:00'), 22(2000,90,64,300,'2019-06-24 15:00:00'), 23(2000,63,78,100,'2019-06-21 15:00:00'), 24(2000,78,75,200,'2019-06-20 15:00:00'), 25(2000,75,84,300,'2019-06-19 15:00:00'), 26(2000,81,73,400,'2019-06-18 15:00:00'), 27(3000,90,100,900,'2019-06-27 15:00:00'), 28(3000,100,90,900,'2019-06-26 15:00:00'), 29(3000,90,100,900,'2019-06-25 15:00:00'), 30(3000,100,90,900,'2019-06-24 15:00:00'), 31(3000,90,100,900,'2019-06-21 15:00:00'), 32(3000,90,88,100,'2019-06-20 15:00:00'), 33(3000,87,81,300,'2019-06-19 15:00:00'), 34(3000,81,76,200,'2019-06-18 15:00:00');
  • ビュー作成

日付データだけを抜き出すため日ビューを作ります。

SQL

1create view vw as 2select Date, 3(select count(*)+1 from (select distinct Date from tbl) as t2 where Date>t1.Date ) as rank 4from (select distinct Date from tbl) as t1;
  • 確認

SQL

1select * from vw;
Daterank
2019-06-18 15:00:008
2019-06-19 15:00:007
2019-06-20 15:00:006
2019-06-21 15:00:005
2019-06-24 15:00:004
2019-06-25 15:00:003
2019-06-26 15:00:002
2019-06-27 15:00:001
  • 検索

過去4日というのは3日前までなのでn=3とします

SQL

1set @n=3,@x=1; 2select 3t2.pid, 4max(t2.SC) as SC, 5max(t2.volume) as volume, 6avg(t3.volume) as avg, 7max(t2.volume)/avg(t3.volume) as avg_per, 8max(t2.Date) as Date 9from tbl as t2 10inner join (select Date,(select Date from vw where rank = v1.rank -@n) as Date_After from vw as v1) as v2 11on t2.Date=v2.Date_After 12inner join tbl as t3 13on t3.Date between v2.Date and v2.Date_After 14and t2.SC=t3.SC 15group by pid 16having avg_per>@x 17order by pid
  • 結果
pidSCcvolumeavgavg_perDate
110009004751.8947368421052632019-06-27 15:00:00
310005004251.17647058823529422019-06-25 15:00:00
410004003251.23076923076923082019-06-24 15:00:00
510006002752.18181818181818172019-06-21 15:00:00
1120005002751.81818181818181812019-06-25 15:00:00
1220003002251.33333333333333332019-06-24 15:00:00
1930009007001.28571428571428582019-06-25 15:00:00
2030009005501.63636363636363652019-06-24 15:00:00
2130009003752.42019-06-21 15:00:00

投稿2019/06/28 07:02

編集2019/07/01 04:17
yambejp

総合スコア114585

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

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

miya71ma

2019/06/28 07:05

すみません、飛ばして1日とします
yambejp

2019/06/28 07:06

それはカレンダーを別途もたないと無理です
miya71ma

2019/06/28 07:08

ではそうでない場合はどうすればいいのでしょうか?
yambejp

2019/06/28 07:20

もうちょっとサンプル増やして、想定する結果も表示してもらえませんか?
miya71ma

2019/07/01 01:35

追記しました
yambejp

2019/07/01 04:13

日付の持ち方がSQL的でないので無理やりビューなどで正規化するのが妥当。 あとはざっと処理しました
guest

0

X%以上というのをどのように検索条件に反映させればいいのでしょうか

たぶん算数の問題だと思うんで、これ参考にしてSQLで計算するだけかと。

投稿2019/06/28 06:54

gentaro

総合スコア8949

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問