2017-05-30 364 views
6

比方說,比如你有一個像這樣的表:如何刪除某些字段(在SQLite中)有重複數據的連續行?

------------------------------- 
Date  Name   Type 
2017-01-01 John   1 
2017-01-02 John   1 
2017-01-03 Mike   2 
2017-01-04 John   1 
------------------------------- 

我希望能夠按類型得到像下面這樣

------------------------- 
Name   Type 
John   1 
Mike   2 
John   1 
------------------------- 

結果正如你所看到的第一個兩行被分組,因爲它們之間沒有不同的類型,就像您在手機中看到的通話記錄一樣。

我該如何在SQLite中實現?

+0

你如何訂購這些數據? – iamdave

+0

@iamdave讓我們說有一個日期列,並按該列排序 –

+0

另外,這是'SQLite'還是'tsql'?它們是具有不同功能的SQL的不同版本。 – iamdave

回答

1

你可以用一個有序的臨時表和一些ROWID比較要這樣做:

sqlite> create table t (date, name, type); 
sqlite> insert into t (date, name, type) values ('2017-01-01', 'John', 1); 
sqlite> insert into t (date, name, type) values ('2017-01-02', 'John', 1); 
sqlite> insert into t (date, name, type) values ('2017-01-03', 'Mike', 2); 
sqlite> insert into t (date, name, type) values ('2017-01-04', 'John', 1); 

sqlite> create temp table tp as select date, name, type from t order by date; 
sqlite> delete from tp 
    where tp.name = (select name from t where t.rowid = tp.rowid - 1) 
    and tp.type = (select type from t where t.rowid = tp.rowid - 1); 
sqlite> select * from tp; 
2017-01-01|John|1 
2017-01-03|Mike|2 
2017-01-04|John|1 
sqlite> 
+0

您能否澄清一下這部分是做什麼的?t.rowid = tp.rowid - 1'?爲什麼' - 1'? – azizbekian

+0

它與'tp.rowid - 1'比較以消除具有相同名稱和類型的連續(按日期排序)行。 –

+0

但是,這是否正好適用於此示例,還是適用於任意輸入? 「-1」部分讓我感到困惑 – azizbekian

3

以下查詢通過NOT EXISTS對前一行(如果有)的相同NameType值實現此目的。前一行是通過查找嚴格小於當前行日期的最大日期找到的。

SELECT * 
FROM tbl t1 
WHERE NOT EXISTS (
    SELECT * 
    FROM tbl t2 
    WHERE t2.Name = t1.Name 
    AND t2.Type = t1.Type 
    AND t2.`Date` = (SELECT MAX(`Date`) 
        FROM tbl t3 
        WHERE t3.`Date` < t1.`Date`) 
); 

SQL小提琴演示:http://sqlfiddle.com/#!5/0700cb/3