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

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

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

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

Q&A

解決済

1回答

258閲覧

継続期間中に1度でもid変更があった場合除外したい

sou10

総合スコア4

SQLite

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

0グッド

0クリップ

投稿2020/10/24 09:47

前提・実現したいこと

ユーザーが一定期間、同一端末を使用しているか調べるクエリを書こうと思っています。

条件としては、

・端末使用開始日はstart_dateでdataテーブルの中に入っています。
・今回起算日となるtrouble_dateが存在した2週間の期間の中で1日後,2日後,3日後・・・14日後いずれかの日にも期間中に端末を変更する事があれば、データとして除外する形にしたいです。

クエリとしては機能しませんがニュアンスとしては下記のようなものを想定しています。
14日間に一度でも、の条件の入れ方が分からず詰まってます。よろしくお願いします。

該当のソースコード

SQLite

1SELECT user_id,serial_number,start_date,trouble_date 2FROM data 3WHERE start_date <= trouble_date 4AND serial_number=serial_number AND trouble_date interval -14 5

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

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

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

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

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

dodox86

2020/10/25 03:50

説明が少し分からないのですが、言い方を変えると、trouble_dateに値があったとして、start_date からtrouble_date までの期間が14日を超えていたら除外しない、ということでしょうか。
sou10

2020/10/25 08:28

間違えて関係の無い記述をしてしまい申し訳ありません。 trouble_dateの直後14日間であり、start_dateとの差分は特に関係がありません。
dodox86

2020/10/25 09:06

すみません、相変わらず分からないのですが、trouble_dateの直後14日間に何があると除外する(あるいは除外しない)のでしょうか。 trouble_dateの直後14日間の間に、別のserial_numberのstart_dateがある、つまり別の端末を使ったか否か、なのでしょうか。それもstart_dateは関係ないのですか。 ※この質問を読んだ他の閲覧者、回答者の方も恐らく分からないのではないか?と懸念してのコメントです。
dodox86

2020/10/25 09:50

ああ、質問件名で「継続期間中に1度でもid変更があった場合除外したい」とありますね。 つまり、trouble_dateの直後14日間の間に、同じユーザーのidで別のserial_numberのstart_dateがある(<別の端末を使い始めた?)ものは除外する、というのが正しいでしょうか。
sou10

2020/10/25 10:18

はい、別の端末を使い始めるとserial_numberが変わる形です。ユーザーidに対しtrouble_dateが存在し、直後14日間に端末変更があった場合(serial_number)が切り替わった場合除外したい形です…
yuxki

2020/10/26 11:08

start_dateとtrouble_dateには、どういった型の、どのような値が入りますか?
sou10

2020/10/26 11:51

こちらも漏れていて申し訳ないです。start_date、trouble_date共にdate型になります。2019-01-01のような形です。
dodox86

2020/10/26 12:01

正確に言うと、SQLiteはカラムの型にDate相当は無いので、"YYYY-MM-DD"な日付の文字列でしょうね。
guest

回答1

0

ベストアンサー

想像を働かせて書いてみましたが、こんな感じのイメージでしょうか?
副問い合わせの中でtrouble_dateの存在するデータをとって、
serial_numberが異なるidのデータと内部結合しています。
14日の判定はbetween句を使と、datetime関数を使っています。

SQLite

1SELECT 2   before_data.user_id 3, before_data.serial_number AS serial_number_before 4, after_data.serial_number AS serial_number_after 5FROM 6 ( 7 SELECT  8 user_id 9 , serial_number 10 , start_date 11 , trouble_date 12 FROM 13 data 14 WHERE start_date <= trouble_date 15 ) AS before_data // trouble_dateが存在する 16INNER JOIN data AS after_data 17ON before_data.user_id = after_data.user_id 18AND before_data.serial_number != after_data.serial_number 19AND before_data.start_date <= after_data.start_date 20WHERE 21after_data.start_date BETWEEN before_data.trouble_date and datetime(before_data.trouble_date, '+14 days')

検証ができておりませんこと、ご承知ください...

投稿2020/10/26 13:23

yuxki

総合スコア110

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

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

sou10

2020/10/29 04:42

急用でお礼が遅くなりすみません。 JOIN後でこのような書き方をすれば良かったのかと勉強になりました。 有難うございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問