2012-02-03 17 views
5

मैं एक मेज से डुप्लिकेट को हटाने की जरूरत द्वारा विभाजन का उपयोग करके डुप्लीकेट:निकाल रहा है SQL सर्वर

;WITH cte as(
SELECT ROW_NUMBER() OVER (PARTITION BY [specimen id] 
             ORDER BY (SELECT 0)) RN 
     FROM quicklabdump) 
     delete from cte where RN>1 

स्तंभ quicklabdumpID प्राथमिक कुंजी है।

मैं चाहूँगा पता है कि कैसे केवल रखने के लिए सबसे बड़ा quicklabdumpID जहां विभाजन

delete q 
    from quicklabdump q 
    where exists 
    (
    select * 
     from quicklabdump q2 
     where q2.[specimen id] = q.[specimen id] and 
     q2.quicklabdumpID > q.quicklabdumpID 
) 

उत्तर

13

quicklabdumpid DESC को करके अपने आदेश को बदलें के लिए [specimen id]

+0

हटाएं। क्या आप कृपया मुझे बता सकते हैं कि क्लिंट के समाधान के साथ कोई समस्या है? –

+0

@I__ - यह वही करेगा। प्रदर्शन में एक अंतर हो सकता है। यदि आप जानना चाहते हैं कि कौन सा तेज़ होगा तो आपको अपने डेटा पर उनका परीक्षण करना होगा। –

4

कोई ज़रूरत नहीं की अनेक गतिविधियां देखते हैं।

WITH cte as(
    SELECT ROW_NUMBER() OVER (PARTITION BY [specimen id] 
          ORDER BY quicklabdumpid DESC) RN 
    FROM quicklabdump) 
delete from cte where RN>1 
+0

सिर्फ उत्सुक, क्या आप यहां 'quicklabdump' से हट रहे हैं और @I__ 'cte' से हटा रहा है? – cctan

+0

@cctan - cte एक उपनाम है जो कथन के साथ प्रयोग किया जाता है। –

+0

@ClintGood इसके लिए आपको बहुत बहुत धन्यवाद। क्या आप कृपया मुझे बता सकते हैं कि अगर मुझे 2 से अधिक डुप्लिकेट [नमूना आईडी] एस हैं तो मुझे यह कई बार चलाने की ज़रूरत होगी? उदाहरण के लिए spec123, spec123, और spec123, quicklabdumpid 1, 2, 3 –