アプリ版:「スタンプのみでお礼する」機能のリリースについて

下記のようなデータを扱っております。
ID | Point
1 | 10
2 | 20
3 | 30
4 | 20
5 | 30
6 | 10
7 | 20
8 | 30
9 | 30

上記データにおいて、Pointが10,20,30と連続している時の
Pointが30でのID値を取得するSQL文が分かりません。

上記データであれば、ID3と8が条件に合致しており、取得したいID値となります。
ID5や9はPointが30ですが、『Pointが10,20,30と連続している』という条件に合致していない為、取得したいID値ではありません。

これを叶えるSQL文を教えて頂けないでしょうか。
(SQLiteを使用しています。)

A 回答 (2件)

テーブル名は、Tseq とします。



下記のSQLでどうでしょうか。
Accessで試してうまくいきました。
SQLite ではどうか分かりません。

SELECT Tseq.ID
FROM Tseq, Tseq AS T1, Tseq AS T2
WHERE Tseq.Point=30 AND T1.ID=Tseq.ID-1 AND T1.Point=20 AND T2.ID=Tseq.ID-2 AND T2.Point=10;
    • good
    • 1

SQL文っていうのは基本的にレコード順ってあまり考慮されません。


どうしてもやるのであれば……1レコードにPointが3件並ぶようにサブクエリを書くしかないでしょうね。
テストしてないのでこのまま書いても動かないかも知れませんが。

まずは連続するIDのレコードが3件並ぶクエリを書きます。

select T1.ID as ID1, T1.Point as Pt1,
T2.ID as ID2, T2.Point as Pt2,
T3.ID as ID3, T3.Point as Pt3
from Data AS T1
left join Data AS T2 on T2.ID = T1.ID + 1
left join Data AS T3 on T3.ID = T1.ID + 2

これで連続するIDのレコードが並んだデータが出来上がります。
ID1,Pt1,ID2,Pt2,ID3,Pt3
1, 10, 2, 20, 3, 30
2, 20, 3, 30, 4, 20
3, 30, 4, 20, 5, 30
4, 20, 5, 30...........
5, 30...........
...........

こんな感じに。
さらにこれをサブクエリとして、Pointがそれぞれ10,20, 30のレコードを選ぶようにWhere文を書きます。

select * from
(select T1.ID as ID1, T1.Point as Pt1,
T2.ID as ID2, T2.Point as Pt2,
T3.ID as ID3, T3.Point as Pt3
from Data AS T1
left join Data AS T2 on T2.ID = T1.ID + 1
left join Data AS T3 on T3.ID = T1.ID + 2
)
where Pt1=10 and Pt2=20 and Pt3=30

これで取得出来るかと。
Where文の中身を書き換えて
where Pt1+10 = Pt2 and Pt2+10=Pt3
とすれば10点間隔でPointが上がっているIDも分かるかと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す