- 締切済み
連続したデータを条件とするSQL文の書き方
下記のようなデータを扱っております。 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を使用しています。)
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- hatena1989
- ベストアンサー率87% (378/433)
テーブル名は、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;
- ESE_SE
- ベストアンサー率34% (157/458)
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も分かるかと思います。