दृष्टिकोण
मूल्यों की एक सीमित सूची को डी-डुप्लिकेट करने के लिए निम्नलिखित दृष्टिकोण का उपयोग किया जा सकता है।
REPLACE()
का उपयोग करें विभिन्न सीमांककों को एक ही सीमांकक में बदलने का कार्य करता है।REPLACE()
का उपयोग करें एक्सएमएल खंड बनाने के लिए एक्सएमएल क्लोजिंग और ओपनिंग टैग इंजेक्ट करने के लिए कार्य करता हैCAST(expr AS XML)
का उपयोग करें उपरोक्त खंड को XML डेटा प्रकार में बदलने के लिए कार्य करता हैOUTER APPLY
का उपयोग करें तालिका-मूल्यवान फ़ंक्शन को लागू करने के लिएnodes()
एक्सएमएल खंड को उसके घटक एक्सएमएल टैग में विभाजित करने के लिए। यह प्रत्येक XML टैग को एक अलग पंक्ति पर लौटाता है।value()
. का उपयोग करके XML टैग से केवल मान निकालें फ़ंक्शन, और निर्दिष्ट डेटा प्रकार का उपयोग करके मान लौटाता है।- उपरोक्त मान के बाद अल्पविराम लगाएं।
- ध्यान दें कि ये मान अलग-अलग पंक्तियों में दिए गए हैं।
DISTINCT
. का उपयोग कीवर्ड अब डुप्लिकेट पंक्तियों (यानी मान) को हटा देता है। FOR XML PATH('')
के लिए उपयोग करें एकाधिक पंक्तियों में मानों को एक पंक्ति में संयोजित करने के लिए खंड।
क्वेरी
उपरोक्त दृष्टिकोण को क्वेरी फॉर्म में रखना:
SELECT DISTINCT PivotedTable.PivotedColumn.value('.','nvarchar(max)') + ','
FROM (
-- This query returns the following in theDataXml column:
-- <tag>test1</tag><tag>test2</tag><tag>test1</tag><tag>test2</tag><tag>test3</tag><tag>test4</tag><tag>test4</tag><tag>test4</tag>
-- i.e. it has turned the original delimited data into an XML fragment
SELECT
DataTable.DataColumn AS DataRaw
, CAST(
'<tag>'
-- First replace commas with pipes to have only a single delimiter
-- Then replace the pipe delimiters with a closing and opening tag
+ replace(replace(DataTable.DataColumn, ',','|'), '|','</tag><tag>')
-- Add a final set of closing tags
+ '</tag>'
AS XML) AS DataXml
FROM ( SELECT 'test1,test2,test1|test2,test3|test4,test4|test4' AS DataColumn) AS DataTable
) AS x
OUTER APPLY DataXml.nodes('tag') AS PivotedTable(PivotedColumn)
-- Running the query without the following line will return the data in separate rows
-- Running the query with the following line returns the rows concatenated, i.e. it returns:
-- test1,test2,test3,test4,
FOR XML PATH('')
इनपुट और परिणाम
इनपुट को देखते हुए:
उपरोक्त क्वेरी परिणाम लौटाएगी:
अंत में अनुगामी अल्पविराम पर ध्यान दें। इसे हटाने के लिए मैं इसे आप पर एक अभ्यास के रूप में छोड़ता हूँ।
संपादित करें:डुप्लिकेट की संख्या
ओपी ने एक टिप्पणी में अनुरोध किया "मैं डुप्लिकेट की t5he गिनती कैसे प्राप्त करूं? एक अलग कॉलम में ".
उपरोक्त क्वेरी का उपयोग करने का सबसे आसान तरीका होगा लेकिन अंतिम पंक्ति को हटा दें FOR XML PATH('')
के लिए . फिर, SELECT
. द्वारा लौटाए गए सभी मानों और अलग-अलग मानों को गिनना उपरोक्त क्वेरी में अभिव्यक्ति (यानी PivotedTable.PivotedColumn.value('.','nvarchar(max)')
) सभी मानों की गिनती और अलग-अलग मानों की गिनती के बीच का अंतर डुप्लिकेट मानों की गिनती है।
SELECT
COUNT(PivotedTable.PivotedColumn.value('.','nvarchar(max)')) AS CountOfAllValues
, COUNT(DISTINCT PivotedTable.PivotedColumn.value('.','nvarchar(max)')) AS CountOfUniqueValues
-- The difference of the previous two counts is the number of duplicate values
, COUNT(PivotedTable.PivotedColumn.value('.','nvarchar(max)'))
- COUNT(DISTINCT PivotedTable.PivotedColumn.value('.','nvarchar(max)')) AS CountOfDuplicateValues
FROM (
-- This query returns the following in theDataXml column:
-- <tag>test1</tag><tag>test2</tag><tag>test1</tag><tag>test2</tag><tag>test3</tag><tag>test4</tag><tag>test4</tag><tag>test4</tag>
-- i.e. it has turned the original delimited data into an XML fragment
SELECT
DataTable.DataColumn AS DataRaw
, CAST(
'<tag>'
-- First replace commas with pipes to have only a single delimiter
-- Then replace the pipe delimiters with a closing and opening tag
+ replace(replace(DataTable.DataColumn, ',','|'), '|','</tag><tag>')
-- Add a final set of closing tags
+ '</tag>'
AS XML) AS DataXml
FROM ( SELECT 'test1,test2,test1|test2,test3|test4,test4|test4' AS DataColumn) AS DataTable
) AS x
OUTER APPLY DataXml.nodes('tag') AS PivotedTable(PivotedColumn)
ऊपर दिखाए गए समान इनपुट के लिए, इस क्वेरी का आउटपुट है:
CountOfAllValues CountOfUniqueValues CountOfDuplicateValues
---------------- ------------------- ----------------------
8 4 4