2017-05-30 10 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' है? वे विभिन्न कार्यक्षमताओं के साथ एसक्यूएल के विभिन्न संस्करण हैं। – 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

निम्न क्वेरी द्वारा Name और Type पिछली पंक्ति (यदि कोई है) के मानों के लिए इसे प्राप्त करती है। पिछली पंक्ति अधिकतम तिथि की तलाश करके पाई जाती है जो वर्तमान पंक्ति की तारीख से सख्ती से कम है।

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`) 
); 

एसक्यूएल फिडल डेमो:http://sqlfiddle.com/#!5/0700cb/3

संबंधित मुद्दे