2017-03-07 1 views
0

列内で共通の値を持つすべての行(範囲に対して)を選択する必要があります。例えば列の共通の値を持つn番目の範囲/行の島を選択しますか?

(最後の行から開始)

私は_user_id != 1まで_user_id == 1のすべての行を選択しようか?

Iは、 _user_idの結果グループに Common Table Expressionsを使用する私の試みで 行を選択する際に得られる。この場合

[4、5、6]

+------------------------+ 
| _id _user_id amount | 
+------------------------+ 
| 1 1   777 | 
| 2 2   1  | 
| 3 2   11  | 
| 4 1   10  | 
| 5 1   100 | 
| 6 1   101 | 
+------------------------+ 

/*Create the table*/ 
CREATE TABLE IF NOT EXISTS t1 ( 
_id    INTEGER   PRIMARY KEY AUTOINCREMENT, 
_user_id   INTEGER, 
amount   INTEGER); 

/*Add the datas*/ 
INSERT INTO t1 VALUES(1, 1, 777); 
INSERT INTO t1 VALUES(2, 2, 1); 
INSERT INTO t1 VALUES(3, 2, 11); 
INSERT INTO t1 VALUES(4, 1, 10); 
INSERT INTO t1 VALUES(5, 1, 100); 
INSERT INTO t1 VALUES(6, 1, 101); 

/*Check the datas*/ 
SELECT * FROM t1; 

1|1|777 
2|2|1 
3|2|11 
4|1|10 
5|1|100 
6|1|101 

。これは、一意の値を含む最後の行のインデックスが得られる(例えばSELECT _id FROM t1 GROUP BY _user_id LIMIT 2;が生成されます。[6,3])

それからLIMIT 1 OFFSET 1下端(3)とLIMIT 1範囲を選択するために、これら2つの値を使用します上端が(6)

WITH test AS (
    SELECT _id FROM t1 GROUP BY _user_id LIMIT 2 
) SELECT * FROM t1 WHERE _id BETWEEN 1+ (
    SELECT * FROM test LIMIT 1 OFFSET 1 
) and (
    SELECT * FROM test LIMIT 1 
); 

出力です:

4|1|10 
5|1|100 
6|1|101 

これが最後の「島」を選択でOK動作しているように見えますが、私が本当に必要なのはn番目の島を選択する方法であります。

パラメータnを提供するときに、これらのような出力を生成することが可能なクエリを生成する方法はありますか?A:

island (n=1): 
    4|1|10 
    5|1|100 
    6|1|101 

island (n=2): 
    2|2|1 
    3|2|11 

island (n=3): 
    1|1|777 

ありがとう!

答えて

1

SQLテーブルは順不同ですので、島を探索するための唯一の方法は、連続した_id値を検索することです:

WITH RECURSIVE t1_with_islands(_id, _user_id, amount, island_number) AS (
    SELECT _id, 
     _user_id, 
     amount, 
     1 
    FROM t1 
    WHERE _id = (SELECT max(_id) 
       FROM t1) 

    UNION ALL 

    SELECT t1._id, 
     t1._user_id, 
     t1.amount, 
     CASE WHEN t1._user_id = t1_with_islands._user_id 
       THEN island_number 
       ELSE island_number + 1 
     END 
    FROM t1 
    JOIN t1_with_islands ON t1._id = (SELECT max(_id) 
            FROM t1 
            WHERE _id < t1_with_islands._id) 
) 
SELECT * 
FROM t1_with_islands 
ORDER BY _id; 
+0

がこれを供給するためのありがとう!私はしかし、私は行を削除する場合、それはもはや連続していない主キーのために前の行で停止するいくつかの問題を抱えています。何かご意見は? – Logic1

+0

⁎grumble⁎元の質問に尋ねられたものではありません... –

+0

早く言及してくれて申し訳ありません。それにもかかわらず、私はエントリを削除し、PKが連続していることを保証する方法をよりよく管理することで、その周りに道を見いだしました(それでも将来は問題になる可能性があります)。しかし、あなたの答えは大変ありがとうございました。とても役に立ちました! – Logic1

関連する問題