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

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

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

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

Q&A

解決済

2回答

951閲覧

MySQLでのhaving をしたものの最新値を取得したい

miya71ma

総合スコア49

MySQL

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

0グッド

0クリップ

投稿2019/07/05 05:26

編集2019/07/05 05:47

MYSQL

1CREATE TABLE table1( 2SC int(4) NOT NULL, 3todays_close double, 4ago_close double, 5volume double, 6`Date` datetime NOT NULL 7); 8 9insert into table1 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'),

MYSQL

1select *,max(volume) as maxVol from table1 as t1 2WHERE date BETWEEN "2019-06-20 00:00:00" AND "2019-06-27 15:00:00" AND todays_close > ago_close AND date BETWEEN "2019-06-25 15:00:00" AND "2019-0627 15:00:00" GROUP BY SC HAVING COUNT(*) = 3

やりたいこと:最新のデータから3日連続todays_close > ago_closeとなっているもの(27,26,25日)の最新の値(この場合6/27のもの)を表示したい。(今の時点では6/25のものが表示されてしまう)
やったこと:WHERE句にdate=(select max(date) from table1 as t2 where t1.SC=t2.SC)
ただこれだと結果が表示されませんでした

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

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

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

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

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

Orlofsky

2019/07/05 05:32

insert_info の CREATE TABLE を提示してください。
miya71ma

2019/07/05 05:34

すみません、table1でした
sazi

2019/07/05 05:34

なぜ、dateに関する異なる範囲条件がANDでされているのか分かりませんけども(重なっている部分の範囲条件だけで良いのでは?)、範囲条件内で3日連続ですか?それとも3日連続だった最新に対する範囲条件ですか?
sazi

2019/07/05 05:36

そもそも、解決した前の質問が生かされていないのは何故?
miya71ma

2019/07/05 05:45

最大値は2019-06-20 00:00:00" ~ "2019-06-27 15:00:00, 三日連続は最新のデータから三日(27,26,25日)での条件のため異なる範囲としています 質問は理解して生かしていたつもりですがどの点が生かされていませんか?
yambejp

2019/07/05 05:46

何度回答しても質問がもどっていく・・・
Orlofsky

2019/07/05 06:05

INSERT の最後が , はエラーだし。
Orlofsky

2019/07/05 06:07

カラム名の DATE が SELECT 中ではバッククォートで囲まないし。
guest

回答2

0

最新のデータから3日連続todays_close > ago_closeとなっているものの最新の値を表示したい

SQL

1select * 2from table1 as t1 3WHERE todays_close > ago_close 4 -- 最新データ 5 and not exists(select 1 from table1 where SC=t1.SC and t1.date<date) 6 -- 1日前のtodays_close > ago_closeが存在 7 and exists(select 1 from table1 where todays_close > ago_close and SC=t1.SC and date=t1.date - interval 1 days) 8 -- 2日前のtodays_close > ago_closeが存在 9 and exists(select 1 from table1 where todays_close > ago_close and SC=t1.SC and date=t1.date - interval 2 days)

※特定期間の最新データとしたい場合は、期間の条件を追加

投稿2019/07/05 06:56

編集2019/07/05 07:21
sazi

総合スコア25195

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

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

0

ベストアンサー

ago_closeって前日の終値じゃないんですか?
前日のtoday_closeと当日のago_closeの値があっていません

function

任意の日付のn日前を拾うfunctionを作ってみました
以下一度だけ実行してください

SQL

1drop function if exists prev_date; 2delimiter // 3create function prev_date(d datetime,i int) RETURNS datetime DETERMINISTIC 4begin 5set @a=null,@b=null; 6select (select count(*)+1 from (select distinct Date from table1) as t1 where t1.Date>t2.Date) into @a 7from (select distinct Date from table1) as t2 8where Date=d; 9select Date into @b 10from (select distinct Date from table1) as t3 11having (select count(*)+1 from (select distinct Date from table1) as t4 where t4.Date>t3.Date)=@a+i; 12return @b; 13end 14// 15delimiter ;
  • テスト

SQL

1select SC, 2Date, 3prev_date(Date,1), 4prev_date(Date,2) 5from table1
  • functionを利用して1日前、2日前のtodays_closeを拾う

SQL

1]select t1.SC, 2t1.Date, 3t1.todays_close, 4t2.Date, 5t2.todays_close, 6t3.Date, 7t3.todays_close 8from table1 as t1 9inner join table1 as t2 on prev_date(t1.Date,1)=t2.Date and t1.SC=t2.SC 10inner join table1 as t3 on prev_date(t1.Date,2)=t3.Date and t1.SC=t3.SC

投稿2019/07/05 06:25

編集2019/07/05 07:40
yambejp

総合スコア114843

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問