2017-03-07 50 views
0

我需要選擇列中具有共同值的所有行(對於範圍)。選擇第n個行/列中哪些列具有共同值的島?

例如(從最後一行開始)

我儘量選擇所有行的其中_user_id == 1直到_user_id != 1

在這種情況下產生選擇行[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 

以我嘗試我使用Common Table Expressions到組的_user_id結果。這給出了含有一個唯一的值的最後行的索引(例如SELECT _id FROM t1 GROUP BY _user_id LIMIT 2;會產生:[6,3])

我然後使用這兩個值來選擇一個範圍,其中LIMIT 1 OFFSET 1是下端(3)和LIMIT 1是上端(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 

這似乎在選擇最後的「孤島」,但我真的需要好的工作是一種選擇的第n個島嶼。

有沒有一種方法來生成時能夠提供的參數n產生這樣的輸出的查詢:

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

相關問題