2017-05-30 16 views
6

Diyelim ki böyle bir tablo var örneğin diyelim:Belirli alanlarda (SQLite'de) yinelenen verilerle ardışık satırlar nasıl kaldırılır?

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

aşağıdaki

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

gibi bir sonuç almak için türlerine göre gruba isterler öncelikle görebileceğiniz gibi İki satır gruplandırıldı çünkü aralarında, cep telefonlarındaki arama günlüklerinde gördüğünüz gibi farklı bir tür yok.

Bunu SQLite'de nasıl yapabilirim?

+0

nasıl bu verileri sipariş? – iamdave

+0

@iamdave, bir tarih sütunu olduğunu ve bu sütun tarafından sipariş verdiğimizi söyler –

+0

Ayrıca, bu 'SQLite' veya' tsql' nedir? Farklı işlevselliğe sahip SQL'in farklı versiyonlarıdır. – iamdave

cevap

1

Sen sıralı bir geçici tablo ve bazı rowid karşılaştırmalar ile yapabilirsiniz:

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

Lütfen bu bölümün ne işe yaramıyor? T.rowid = tp.rowid - 1'? Neden tam olarak - 1'? – azizbekian

+0

Aynı ad ve türle ardışık (tarih sıralamasına göre) satırları ortadan kaldırmak için 'tp.rowid - 1' ile karşılaştırılıyor. –

+0

Fakat bu tam olarak bu örnek için çalışıyor mu, yoksa keyfi giriş için mi çalışıyor? "-1" kısmı beni şaşırtıyor – azizbekian

3

aşağıdaki sorgu bir önceki satıra (varsa) aynı Name ve Type değerler için NOT EXISTS başarır. Bir önceki satır, mevcut satırın tarihinden daha az olan maksimum tarihi arayarak bulunur.

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

İlgili konular