2009-07-23 24 views
10

मेरे पास कुछ पंक्तियों वाली एक टेबल है। प्रत्येक पंक्ति में दिनांक-फ़ील्ड है। अभी, यह एक तिथि के डुप्लीकेट हो सकता है। मुझे सभी डुप्लीकेट हटाने और केवल उच्चतम id के साथ पंक्ति को स्टोर करने की आवश्यकता है। SQL क्वेरी का उपयोग करके यह कैसे संभव है?एसक्यूएल के साथ डुप्लिकेट पंक्तियों को कैसे हटाएं?

अब:

date  id 
'07/07' 1 
'07/07' 2 
'07/07' 3 
'07/05' 4 
'07/05' 5 

क्या मैं चाहता हूँ:

date  id 
'07/07' 3 
'07/05' 5 
+0

आपके द्वारा भेजे गए डेटा से, आप दो तीन पंक्तियों के साथ समाप्त हो जाते हैं! 07/05 दोहराया गया है। – notnoop

उत्तर

33
DELETE FROM table WHERE id NOT IN 
    (SELECT MAX(id) FROM table GROUP BY date); 
+0

वाह, क्या मैं एक चौराहे के रास्ते या क्या गया? यह निश्चित रूप से ऐसा करने का सबसे अच्छा तरीका है। – Eric

+0

मैंने सोचा कि आपका रास्ता थोड़ा जटिल था ... लेकिन ईमानदारी से, मैं इसे पहले सिर्फ 3 प्रश्नों का उपयोग करके करना चाहता था। –

+4

यह क्वेरी इस उत्तर के लिए भी उपयोगी है: चयन दिनांक, COUNT (दिनांक) AS NumOccurrences तालिका से ग्रुप बाय तिथि है (COUNT (दिनांक)> 1) – djangofan

2

mysql, PostgreSQL, ओरेकल बेहतर तरीका के लिए स्वयं में शामिल हों है।

Postgresql: 
DELETE FROM table t1 USING table t2 WHERE t1.date=t2.date AND t1.id<t2.id; 

MySQL   
DELETE FROM table 
USING table, table as vtable 
WHERE (table.id < vtable.id) 
AND (table.date=vtable.date) 

एसक्यूएल समेकित (अधिकतम, समूह द्वारा) फ़ंक्शंस लगभग हमेशा धीमे होते हैं।

6

मैं टिप्पणी अधिकार नहीं है, इसलिए यहाँ मामला किसी में एक जवाब के रूप में मेरी टिप्पणी है एक ही समस्या भर आता है:

SQLite3 में, वहाँ एक अंतर्निहित संख्यात्मक प्राथमिक कुंजी "rowid" कहा जाता है, तो एक ही है क्वेरी इस तरह दिखेगी:

DELETE FROM table WHERE rowid NOT IN 
(SELECT MAX(rowid) FROM table GROUP BY date); 

यह किसी भी तालिका के साथ काम करेगा, भले ही इसमें "आईडी" नामक प्राथमिक कुंजी कॉलम न हो।

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