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

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

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

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

SQL

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

Q&A

解決済

2回答

3342閲覧

sql文 特定の時間とその1本前のデータの取得

TaikiNamioka

総合スコア24

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

SQL

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

0グッド

0クリップ

投稿2018/04/13 07:17

編集2018/04/13 07:35

特定の時間とその1本前の時間のレコードを取得する場合どんなSQL文を書けばよりしいでしょうか?

各テーブル4月13日 10時とその1本前の時間のレコードを取得したい
ex.2018-4-13 10:00:00を指定

####M1のテーブル(1分刻みの)場合

|highPrice|lowPrice|openPrice|closePrice|date|
|:--|:--|:--|
|100|98|99|99|2018-04-13 09:57:00|
|100|98|99|99|2018-04-13 09:58:00|
|100|98|99|99|2018-04-13 09:59:00|
|100|98|99|99|201-04-13 10:00:00|

2018-4-13 10:00:00と09:59:00のレコードを取得

####M15のテーブル(15分刻み)場合

|highPrice|lowPrice|openPrice|closePrice|date|
|:--|:--|:--|
|100|98|99|99|2018-04-13 09:15:00|
|100|98|99|99|2018-04-13 09:30:00|
|100|98|99|99|2018-04-13 09:45:00|
|100|98|99|99|201-04-13 10:00:00|

2018-4-13 10:00:00と09:45:00のレコードを取得

####M30のテーブル(30ぷん刻み)の場合

|highPrice|lowPrice|openPrice|closePrice|date|
|:--|:--|:--|
|100|98|99|99|2018-04-13 08:30:00|
|100|98|99|99|2018-04-13 09:00:00|
|100|98|99|99|2018-04-13 09:30:00|
|100|98|99|99|2018-04-13 10:00:00|

2018-4-13 10:00:00と09:30:00のレコードを取得

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

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

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

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

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

m.ts10806

2018/04/13 07:27

「1本前」というのはNo.100だったらNo.99 という意味でしょうか?
m.ts10806

2018/04/13 07:27

また、サンプルデータの日付が一部おかしいです >201-04-13 10:00:00
TaikiNamioka

2018/04/13 07:36

ご質問ありがとうございます!IDではなく時間の並びの1本前になります!
退会済みユーザー

退会済みユーザー

2018/04/13 07:36

トレーダーさんだし。
m.ts10806

2018/04/13 08:01

あ、いえ、IDは例で、「1本前」という表現ではちょっと伝わりにくいかなと思ったわけで。「降順に並べ替えた上での指定の直前のレコード」とかいう表現の方が伝わるんじゃないかな、と。
guest

回答2

0

ベストアンサー

指定した時間が必ず存在するならばlIMIT 2すればいいと思います。

sql

1select * 2from M1 3where date <= '2018-04-13 10:00:00' 4order by date desc 5limit 2

逆にない場合は、うーん。

投稿2018/04/13 07:29

sousuke

総合スコア3828

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

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

TaikiNamioka

2018/04/13 07:37

ご回答ありがとうございます! データは必ずある程なので大丈夫です!
sazi

2018/04/13 07:57 編集

データが無い場合は、existsを条件にすればいいので、order by ~ limit が簡潔ですね。
guest

0

指定した日時とその直前なら、時間の刻みは関係ありませんから、取り敢えずテーブルをMxxとして、
unionでそれぞれ取得します。

SQL

1select * from Mxx 2where date=(select max(date) from Mxx where date<[特定の時間]) 3union all 4select * from Mxx 5where date=[特定の時間]

※SQLiteがlead()やlag()に対応していれば、もっと簡潔になりそうですけどね。

もし、特定の日時のデータが存在するかどうか不明な時は、そのデータが存在するかどうかも条件に加えます。
※簡潔にするためwithを使用

SQL

1with target as ( 2 select * from Mxx where date=[特定の時間] 3) 4select * from Mxx 5where date=(select max(date) from Mxx where date<[特定の時間]) 6 and exists(select 1 from target) 7union all 8select * from target

投稿2018/04/13 07:39

編集2018/04/13 07:44
sazi

総合スコア25138

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

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

TaikiNamioka

2018/04/13 07:47

データがない場合までご丁寧にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問