2012-06-20 13 views
5

मेरे पास कुछ डुप्लिकेट पंक्तियों वाली एक तालिका है। मैं केवल एक डुप्लिकेट पंक्ति को हटाना चाहता हूं।एसक्यूएल क्वेरी केवल एक डुप्लिकेट पंक्ति को हटाने के लिए

उदाहरण के लिए Iv 9 डुप्लिकेट पंक्तियां इसलिए केवल एक पंक्ति को हटाना चाहिए और 8 शेष पंक्तियां दिखानी चाहिए।

उदाहरण

तारीख बुला बुलाया अवधि timestampp

2012-06-19 10:22:45.000 165 218 155 1.9 121 
2012-06-19 10:22:45.000 165 218 155 1.9 121 
2012-06-19 10:22:45.000 165 218 155 1.9 121 
2012-06-19 10:22:45.000 165 218 155 1.9 121 
तारीख से

केवल एक पंक्ति को हटा देना चाहिए और 3 पंक्तियों

2012-06-19 10:22:45.000 165 218 155 1.9 100 
2012-06-19 10:22:45.000 165 218 155 1.9 100 
2012-06-19 10:22:45.000 165 218 155 1.9 100 
तारीख से

दिखाने के केवल एक पंक्ति को हटा देना चाहिए चाहिए और 2 पंक्तियां दिखाएं

मैं यह कैसे कर सकता हूं?

+0

क्या आप डेटा को प्रारूपित कर सकते हैं ताकि यह अधिक पढ़ा जा सके? – codingbiz

+0

पांच कॉलम नाम सूचीबद्ध हैं लेकिन आउटपुट में छह कॉलम हैं। और अंतिम स्तंभ 121 से 100 में कैसे बदलता है? अगर स्रोत के साथ 121 और दो पंक्तियों के साथ दो पंक्तियां थीं, तो क्या आप दो पंक्तियों या एक को हटा देंगे? (दूसरे शब्दों में, अकेले दिनांक के आधार पर डुप्लिकेट है?) –

उत्तर

1

क्या आपके पास टेबल पर प्राथमिक कुंजी है?

एक पंक्ति को डुप्लिकेट बनाता है? उसी समय? एक ही तारीख? सभी कॉलम समान हैं?

आप एक प्राथमिक कुंजी है, तो आप केवल एक रिकॉर्ड का चयन करें और उस एक पंक्ति को हटाने के लिए टॉप फ़ंक्शन का उपयोग कर सकते हैं:

Delete from [tablename] where id in (select top 1 id from [tablename] where [clause]) 
3

आप इन पंक्तियों का क्रम कोई आपत्ति नहीं है वहाँ में एक कमांड है MySQL:

DELETE TOP (numberOfRowsToDelete) FROM db.tablename WHERE {condition for ex id = 5}; 
+0

और निश्चित रूप से आप निर्दिष्ट करने के लिए किस तारीख को निर्दिष्ट करने के लिए तत्काल कहां उपयोग कर सकते हैं। – Reshi

+2

ओपी ने एक SQL सर्वर समाधान के लिए कहा। – Spikeh

1

एसक्यूएल सर्वर 2005+ आप निम्न कर सकते के लिए:

;WITH CTE AS 
(
    SELECT *, 
      ROW_NUMBER() OVER(PARTITION BY [date], calling, called, duration, [timestamp] ORDER BY 1) RN 
    FROM YourTable 
) 
DELETE FROM CTE 
WHERE RN = 2 
6

यह समाधान आप की अनुमति देता है (सिर्फ एक समय में डुप्लिकेट के एक विशाल खंड से निपटने के बजाय) डुप्लिकेट के प्रत्येक सेट से एक पंक्ति को हटाने के लिए:

;WITH x AS 
(
    SELECT [date], rn = ROW_NUMBER() OVER (PARTITION BY 
    [date], calling, called, duration, [timestamp] 
    ORDER BY [date]) 
    FROM dbo.UnspecifiedTableName 
) 
DELETE x WHERE rn = 2; 

एक अलग रूप में के रूप में, दोनों [date] और [timestamp] स्तंभ नाम के लिए भयानक विकल्प हैं ...

+0

का अर्थ क्या है; एक्स एएस के साथ ?? – user2705620

+0

@ उपयोगकर्ता6675636b20796f7521 इसे एक [सामान्य तालिका अभिव्यक्ति] कहा जाता है (http://msdn.microsoft.com/en-us/library/ms175972.aspx)। –

+0

धन्यवाद :) यह एक अच्छा समाधान था। – user2705620

0

जब से मैं स्कीमा की जरूरत नहीं है, मैं चरणों में एक संभव समाधान चाहते हैं:

  1. सभी स्तंभों का चयन करने के लिए एक पंक्ति संख्या लागू
  2. मील उन स्तंभों के साथ द्वारा एक समूह बनाने और हटाने के n प्रत्येक समूह में (rownumber)

संपादित करें:

rownumber एक आंतरिक क्वेरी में है और rownumber सभी पंक्तियों में incrementing होगा। बाहरी क्वेरी में मैं समूह को आंतरिक क्वेरी से बना देता हूं और प्रत्येक समूह के लिए न्यूनतम (राउनम्बर) का चयन करता हूं। चूंकि प्रत्येक समूह डुप्लिकेट पंक्तियों द्वारा रचित होता है, इसलिए मैं प्रत्येक समूह के लिए न्यूनतम (राउनम्बर) हटा देता हूं।

+1

MIN प्रत्येक समूह के लिए हमेशा 1 होगा, यदि एक ही कॉलम द्वारा विभाजित किया गया है। इसका अर्थ यह है कि आप उन पंक्तियों को भी हटा देंगे जिन्हें * डुप्लीकेट नहीं है, जब तक कि आप HAVING भी न जोड़ें। जो पहले से पोस्ट किए गए समाधानों से भी अधिक जटिल बनाता है, आईएमएचओ। –

+0

@AaronBertrand nop, rownumber एक आंतरिक क्वेरी में है और सभी पंक्तियों में rownumber वृद्धि होगी। बाहरी क्वेरी में मैं समूह को आंतरिक क्वेरी से बना देता हूं और प्रत्येक समूह के लिए न्यूनतम (राउनम्बर) का चयन करता हूं। चूंकि प्रत्येक समूह डुप्लिकेट पंक्तियों द्वारा रचित होता है, इसलिए मैं प्रत्येक समूह के लिए न्यूनतम (राउनम्बर) हटा देता हूं। क्या तुम्हे समझ आया? –

+0

एक बेहतर विवरण के साथ, निश्चित रूप से, लेकिन यह आपके पहले विवरण से मेल नहीं खाता है। कोड अधिक उपयोगी और आत्म-व्याख्यात्मक होता। –

0

LIMIT 1 का उपयोग कर आप हटाना मदद मिलेगी केवल 1 ROW कि आपके DELETE क्वेरी से मेल खाता:

DELETE FROM `table_name` WHERE `column_name`='value' LIMIT 1; 

पहले:

+----------------------+ 
| id | column_name | 
+-----+----------------+ 
| 1 | value   | 
+-----+----------------+ 
| 2 | value   | 
+-----+----------------+ 
| 3 | value   | 
+-----+----------------+ 
| 4 | value   | 
+-----+----------------+ 

बाद:

+----------------------+ 
| id | column_name | 
+-----+----------------+ 
| 1 | value   | 
+-----+----------------+ 
| 2 | value   | 
+-----+----------------+ 
| 3 | value   | 
+-----+----------------+ 
संबंधित मुद्दे