2017-05-30 12 views
6

Hãy nói rằng ví dụ bạn có một bảng như thế này:Làm thế nào để loại bỏ các hàng liên tiếp với dữ liệu trùng lặp trong các trường nhất định (trong SQLite)?

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

Tôi muốn để có thể nhóm theo loại để có được một kết quả như sau

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

Như bạn có thể nhìn thấy đầu tiên hai hàng được nhóm lại vì không có loại khác nhau ở giữa chúng, giống như thứ bạn nhìn thấy trong nhật ký cuộc gọi điện thoại di động.

Làm cách nào để có thể đạt được điều đó trong SQLite?

+0

How are you đặt hàng dữ liệu này? – iamdave

+0

@iamdave cho phép nói rằng có một cột ngày và được sắp xếp theo cột đó –

+0

Ngoài ra, đây là 'SQLite' hoặc' tsql'? Chúng là các phiên bản khác nhau của SQL với các chức năng khác nhau. – iamdave

Trả lời

1

Bạn có thể làm điều này với một bảng tạm thời ra lệnh và một số so sánh 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

Bạn có thể làm rõ phần này làm gì 't.rowid = tp.rowid - 1'? Tại sao chính xác '- 1'? – azizbekian

+0

So sánh với 'tp.rowid - 1' để loại bỏ các hàng liên tiếp (được sắp xếp theo ngày) với tên và loại giống nhau. –

+0

Nhưng điều này làm việc cho chính xác ví dụ này, hoặc nó sẽ làm việc cho đầu vào tùy ý? Phần "-1" gây nhầm lẫn cho tôi – azizbekian

3

Truy vấn sau đạt được điều này theo số NOT EXISTS cho cùng một giá trị NameType ở hàng trước đó (nếu có). Hàng trước được tìm thấy bằng cách tìm ngày tối đa nhỏ hơn ngày hiện tại của hàng hiện tại.

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 Fiddle demo:http://sqlfiddle.com/#!5/0700cb/3

Các vấn đề liên quan