2012-03-24 14 views
36

का उपयोग कर तालिका में डुप्लिकेट रिकॉर्ड्स खोजें I एक तालिका को मान्य कर रहा है जिसमें एक ई-कॉमर्स साइट का लेनदेन स्तर डेटा है और सटीक त्रुटियां मिलती हैं।SQL सर्वर

मैं SQL सर्वर पर 50 कॉलम तालिका में डुप्लिकेट रिकॉर्ड खोजने में आपकी सहायता चाहता हूं।

मान लीजिए अपने डेटा है:

OrderNo shoppername amountpayed city Item  
1  Sam   10   A Iphone 
1  Sam   10   A Iphone--->>Duplication to be detected 
1  Sam   5   A Ipod 
2  John  20   B Macbook 
3  John  25   B Macbookair 
4  Jack  5   A Ipod 

मान लीजिए मैं नीचे क्वेरी का उपयोग करें:

Select shoppername,count(*) as cnt 
from dbo.sales 
having count(*) > 1 
group by shoppername 

मुझे

Sam 2 
John 2 

वापस आ जाएगी लेकिन मैं सिर्फ नकल को खोजने के लिए नहीं करना चाहते हैं 1 या 2 कॉलम से अधिक। मैं अपने डेटा में सभी स्तंभों पर डुप्लिकेट ढूंढना चाहता हूं। मुझे परिणाम चाहिए:

1  Sam   10   A Iphone 

उत्तर

3

बस क्वेरी में सभी फ़ील्ड जोड़ें और उन्हें समूह में भी जोड़ना याद रखें।

Select shoppername, a, b, amountpayed, item, count(*) as cnt 
from dbo.sales 
group by shoppername, a, b, amountpayed, item 
having count(*) > 1 
+1

मैं 50 क्षेत्रों के लिए प्रयास करें। तो क्या कोई रास्ता नहीं है जिसके द्वारा सभी क्षेत्रों के अलग-अलग नाम लिखने के बिना मैं डुप्लिकेट रिकॉर्ड ढूंढ सकता हूं !! – Matthew

+5

तालिका पर राइट क्लिक करें, चुनें: स्क्रिप्ट टेबल >> >> >> नई क्वेरी संपादक विंडो का चयन करें। अब आपको अपनी चयन सूची मिल गई है, इसे अपने समूह द्वारा अनुभाग में कॉपी और पेस्ट करें। – JerryOL

35
SELECT OrderNo, shoppername, amountPayed, city, item, count(*) as cnt 
FROM dbo.sales 
GROUP BY OrderNo, shoppername, amountPayed, city, item 
HAVING COUNT(*) > 1 
56
with x as (select *,rn = row_number() 
      over(PARTITION BY OrderNo,item order by OrderNo) 
      from #temp1) 

select * from x 
where rn > 1 

आप द्वारा

delete x where rn > 1 
+0

ग्रेट। मैं ओरेकल में इसके बारे में जानता था, लेकिन यह नहीं पता था कि एसक्यूएल सर्वर में भी यह संभव था। – GolezTrol

+0

उत्कृष्ट जवाब। – HShbib

+1

किसी के लिए उत्सुकता के लिए, मैं ओरेकल में इसे कैसे लिखूंगा: 'x के साथ (चयन टी।*, पंक्ति_number() से अधिक (ऑर्डरनो द्वारा पार्टिशन, ऑर्डरनो द्वारा आइटम ऑर्डर) t_dcf टी से आरएन के रूप में) x से चुनें जहां आरएन> 1; ' – Juan

1

चयन बयान बदल कर डुप्लिकेट निकालने के लिए, पहले CHECKSUM समारोह के बारे में इस बजाय

SELECT MAX(shoppername), COUNT(*) AS cnt 
FROM dbo.sales 
GROUP BY CHECKSUM(*) 
HAVING COUNT(*) > 1 

पढ़ें कोशिश कर सकते हैं के रूप में हो सकता है डुप्लिकेट।

4
SQL> SELECT JOB,COUNT(JOB) FROM EMP GROUP BY JOB; 

JOB  COUNT(JOB) 
--------- ---------- 
ANALYST   2 
CLERK    4 
MANAGER   3 
PRESIDENT   1 
SALESMAN   4 
-2

करें * dbo.sales से समूह shoppername होने (गिनती (आइटम)> 1) द्वारा

+0

इसे आज़माएं यह – Mahaveer

+0

काम करेगा जो ** ** काम नहीं करेगा। आपको चुनिंदा सूची में 'कॉलम अमान्य होगा क्योंकि यह कुल कार्य या ग्रुप बाय क्लॉज' त्रुटि – kkuilla

2

कई अभिलेखों की सूची प्राप्त करने के आदेश के बाद का उपयोग करें

select field1,field2,field3, count(*) 
    from table_name 
    group by field1,field2,field3 
    having count(*) > 1 
0
with x as (
select shoppername,count(shoppername) 
       from sales 
       having count(shoppername)>1 
      group by shoppername) 
select t.* from x,win_gp_pin1510 t 
where x.shoppername=t.shoppername 
order by t.shoppername 
-2

EventID का चयन करें, गणना करें () cbo dbo.EventInstancesसेसमूह EventID द्वारा गिनती होने ()> 1

-2

निम्नलिखित चल रहा है कोड:

SELECT abnno, COUNT(abnno) 
FROM tbl_Name 
GROUP BY abnno 
HAVING (COUNT(abnno) > 1) 
+0

में शामिल नहीं है कृपया अपने उत्तर में उचित प्रारूपण शामिल करें, और यह भी समझाएं कि यह स्पष्ट करने के लिए क्या करता है। –

0

सबसे पहले, मुझे लगता है कि परिणाम यह सही नहीं शक? ऐसा लगता है कि मूल तालिका से तीन 'सैम' हैं। लेकिन सवाल के लिए यह महत्वपूर्ण नहीं है।

फिर यहां हम प्रश्न के लिए आते हैं। आपकी तालिका के आधार पर, डुप्लिकेट मान दिखाने का सबसे अच्छा तरीका count(*) और Group by खंड का उपयोग करना है।क्वेरी कैसा दिखेगा इस

SELECT OrderNo, shoppername, amountPayed, city, item, count(*) as RepeatTimes FROM dbo.sales GROUP BY OrderNo, shoppername, amountPayed, city, item HAVING COUNT(*) > 1

कारण है कि अपनी मेज विशिष्ट प्रत्येक रिकॉर्ड की पहचान की, से एक साथ सभी स्तंभों जो रिकॉर्ड नकल के रूप में विचार किया जाएगा मतलब है केवल जब प्रत्येक स्तंभ से सभी मान बिल्कुल एक जैसे हैं , आप डुप्लिकेट रिकॉर्ड्स के लिए सभी फ़ील्ड्स दिखाना चाहते हैं, इसलिए group by किसी भी कॉलम को याद नहीं करेगा, अन्यथा हां क्योंकि आप केवल 'कॉलम 'समूह द्वारा' खंड में भाग ले सकते हैं।

अब मैं आपको With...Row_Number()Over(...) के लिए कोई उदाहरण देना चाहता हूं, जो पंक्ति अभिव्यक्ति का उपयोग Row_Number फ़ंक्शन के साथ कर रहा है।

मान लीजिए कि आपके पास लगभग एक ही सारणी है लेकिन शिपिंग दिनांक नामक एक अतिरिक्त कॉलम के साथ, और मूल्य भी बदल सकता है बाकी बाकी भी हैं। संदेश यह है:

OrderNo shoppername amountpayed city Item Shipping Date
1 Sam 10 A Iphone 2016-01-01 1 Sam 10 A Iphone 2016-02-02 1 Sam 5 A Ipod 2016-03-03 2 John 20 B Macbook 2016-04-04 3 John 25 B Macbookair 2016-05-05 4 Jack 5 A Ipod 2016-06-06

सूचना उस पंक्ति # 2 डुप्लिकेट एक अगर आप अभी भी एक इकाई के रूप सभी स्तंभों ले नहीं है। लेकिन क्या होगा यदि आप इन मामलों में डुप्लिकेट के रूप में भी उनका इलाज करना चाहते हैं? आप With...Row_Number()Over(...) का उपयोग करना चाहिए, और क्वेरी इस प्रकार दिखाई देगा:

WITH TABLEEXPRESSION AS (SELECT *,ROW_NUMBER() OVER (PARTITION BY OrderNo, shoppername, amountPayed, city, item ORDER BY [Shipping Date] as Identifier) --if you consider the one with late shipping date as the duplicate FROM dbo.sales) SELECT * FROM TABLEEXPRESSION WHERE Identifier !=1 --or use '>1'

ऊपर क्वेरी परिणाम एक साथ दे देंगे शिपिंग तिथि के साथ, उदाहरण के लिए:

OrderNo shoppername amountpayed city Item Shipping Date Identifier 1 Sam 10 A Iphone 2016-02-02 2

नोट यह एक अलग है 2016-01-01 के साथ, और 2016-02-02 को फ़िल्टर करने का कारण PARTITION BY OrderNo, shoppername, amountPayed, city, item ORDER BY [Shipping Date] as Identifier है, और शिपिंग तिथि कॉलम में से एक नहीं है जिसे डुप्लिकेट रिकॉर्ड की देखभाल करने की आवश्यकता है, जिसका अर्थ है कि एक 2016-02-02 के साथ अभी भी एक आदर्श हो सकता है आपके प्रश्न के परिणाम।

अब यह छोटा सा संक्षेप में प्रस्तुत, count(*) और Group by का उपयोग कर खंड एक साथ सबसे अच्छा विकल्प है जब आप केवल परिणाम के रूप में Group by खंड से सभी स्तंभों को दिखाना चाहते हैं, अन्यथा आप स्तंभों को group by में भाग नहीं लेते याद करेंगे।

With...Row_Number()Over(...) के लिए, यह हर परिदृश्य में उपयुक्त है कि आप डुप्लिकेट रिकॉर्ड ढूंढना चाहते हैं, हालांकि, क्वेरी लिखने के लिए थोड़ा जटिल है और पहले की तुलना में इंजीनियर पर थोड़ा सा जटिल है।

यदि आपका उद्देश्य तालिका से डुप्लिकेट रिकॉर्ड हटाना है, तो आपको बाद में WITH...ROW_NUMBER()OVER(...)...DELETE FROM...WHERE एक का उपयोग करना होगा।

आशा है कि इससे मदद मिलती है!

0

इस

with T1 AS 
(
SELECT LASTNAME, COUNT(1) AS 'COUNT' FROM Employees GROUP BY LastName HAVING COUNT(1) > 1 
) 
SELECT E.*,T1.[COUNT] FROM Employees E INNER JOIN T1 ON T1.LastName = E.LastName