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

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

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

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

Q&A

解決済

2回答

20642閲覧

WHERE句に期間を指定して抽出する方法を教えてください

wieee

総合スコア11

SQLite

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

0グッド

0クリップ

投稿2018/04/10 06:21

前提・実現したいこと

SQLiteで、WHERE句で期間を指定して抽出したいのです。
単純なテーブルで説明させていただきます。
例えばtb_Itemという以下のようなテーブルがあるとします。

iditemdate
0apple2018-01-01
1apple2018-02-12
2apple2018-03-08
3orange2017-10-05
4orange2017-11-16
5orange2017-12-09

通常、WHERE句で期間を指定して抽出する場合は以下のように指定します。例えば2ヶ月間を指定します。

SQL

1SELECT COUNT(item) FROM tb_Item WHERE date >= '2018-02-01' AND date <= '2018-03-31' GROUP BY item;

このクエリーでは期間を指定しています。
しかし実現したいのは、「各Item毎に記録されている最終日から過去2ヶ月間」を指定してItemの個数を取得したいのです。
これはどのようにクエリーを記述するのでしょうか?

試したこと

WHERE句の中にMAX(date)を使ってみましたがエラーでした。どうやらWHERE句の中ではMAX関数は使えないようです。

SELECT COUNT(item) FROM tb_Item WHERE date >= DATE(MAX(date), '-2 months') AND date <= MAX(date) GROUP BY item;

補足情報(FW/ツールのバージョンなど)

バージョンはSQLite3.4です。

どうぞよろしくお願い致します。

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

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

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

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

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

guest

回答2

0

最初に各itemの最終更新日を取得できるクエリを作る

select item, max(date) as max_date from tb_item group by item

↑これをtb_itemと連結すると、各itemごとの最終更新日と各レコードの更新日を比較できるネタができる。

select t1.item, t1.date, t2.max_date from tb_item as t1 left join (select item, max(date) as max_date from tb_item group by item) as t2 on t1.item = t2.item

↑で、最終更新日と各レコードの更新日を比較して絞り込んで、

select t1.item, t1.date, t2.max_date from tb_item as t1 left join (select item, max(date) as max_date from tb_item group by item) as t2 on t1.item = t2.item where t1.date >= DATE_SUB(t2.max_date, INTERVAL 2 MONTHS)

↑この取得結果をitemでGroup byすればご希望の結果がとれそうですが

select count(item) from ( select t1.item, t1.date, t2.max_date from tb_item as t1 left join (select item, max(date) as max_date from tb_item group by item) as t2 on t1.item = t2.item where t1.date >= DATE_SUB(t2.max_date, INTERVAL 2 MONTHS) ) group by item

↑手元に検証環境がないので、未確認です。

投稿2018/04/10 07:03

tkturbo

総合スコア5572

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

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

wieee

2018/04/11 00:25

ありがとうございます。 saziさんの方法で取得できましたのでご回答頂いた方法を私も検証できていませんが参考にさせていただきます!
guest

0

ベストアンサー

相関問い合わせを使用すると、以下のようになります。

select item ,(select count(*) from tb_Item where item=t1.tb_Item and `date`>=date(t1.`date`, '-2 months')) from tb_Item t1 where `date`=(select max(`date`) from tb_Item where item=t1.item)

解説すると、
外側のwhere条件で、itemごとの最終日付のデータを抽出します。
selectのサブクエリーでは、外側のwhere条件で絞り込まれたデータ1件ごとに、
そのitemと同じもので、そのデータの日付の2カ月前の日付以降のデータをカウントしています。
※試せていませんので、ご容赦下さい。

投稿2018/04/10 07:01

編集2018/04/10 07:30
sazi

総合スコア25138

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

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

wieee

2018/04/11 00:23

ありがとうございます。 まず外側でWHEREで最終日を取得してからなのですね。 その認識がなかったので助かりました! そちらの方法でうまく取得できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問