यदि आपके पास PostgreSQL में डुप्लिकेट पंक्तियों वाली तालिका है, तो आप डुप्लिकेट पंक्तियों को वापस करने के लिए निम्न में से किसी भी क्वेरी का उपयोग कर सकते हैं।
नमूना डेटा
मान लीजिए हमारे पास निम्न डेटा वाली एक तालिका है:
SELECT * FROM Pets;
परिणाम:
petid | petname | pettype -------+---------+--------- 1 | Wag | Dog 1 | Wag | Dog 2 | Scratch | Cat 3 | Tweet | Bird 4 | Bark | Dog 4 | Bark | Dog 4 | Bark | Dog
पहली दो पंक्तियाँ डुप्लिकेट हैं, और अंतिम तीन पंक्तियाँ डुप्लिकेट हैं। ऐसा इसलिए है क्योंकि सभी तीन स्तंभों में प्रत्येक डुप्लिकेट पंक्ति में समान मान होते हैं।
विकल्प 1
हम निम्नलिखित क्वेरी का उपयोग यह देखने के लिए कर सकते हैं कि कितनी पंक्तियाँ डुप्लिकेट हैं:
SELECT
PetId,
PetName,
PetType,
COUNT(*) AS "Count"
FROM Pets
GROUP BY
PetId,
PetName,
PetType
ORDER BY PetId;
परिणाम:
petid | petname | pettype | Count -------+---------+---------+------- 1 | Wag | Dog | 2 2 | Scratch | Cat | 1 3 | Tweet | Bird | 1 4 | Bark | Dog | 3
हम वैकल्पिक रूप से इसे अवरोही क्रम में गिनकर ऑर्डर कर सकते हैं, ताकि सबसे अधिक डुप्लिकेट वाली पंक्तियाँ पहले दिखाई दें:
SELECT
PetId,
PetName,
PetType,
COUNT(*) AS "Count"
FROM Pets
GROUP BY
PetId,
PetName,
PetType
ORDER BY Count(*) DESC;
परिणाम:
petid | petname | pettype | Count -------+---------+---------+------- 4 | Bark | Dog | 3 1 | Wag | Dog | 2 2 | Scratch | Cat | 1 3 | Tweet | Bird | 1
विकल्प 2
हम HAVING
. का उपयोग कर सकते हैं खंड यदि हम केवल डुप्लिकेट पंक्तियों को सूचीबद्ध करना चाहते हैं:
SELECT
PetId,
PetName,
PetType,
COUNT(*) AS "Count"
FROM Pets
GROUP BY
PetId,
PetName,
PetType
HAVING COUNT(*) > 1
ORDER BY PetId;
परिणाम:
petid | petname | pettype | Count -------+---------+---------+------- 1 | Wag | Dog | 2 4 | Bark | Dog | 3
विकल्प 3
एक अन्य विकल्प पोस्टग्रेज के ROW_NUMBER()
. का उपयोग करना है विंडो फ़ंक्शन:
SELECT
*,
ROW_NUMBER() OVER (
PARTITION BY PetId, PetName, PetType
ORDER BY PetId, PetName, PetType
) AS Row_Number
FROM Pets;
परिणाम:
petid | petname | pettype | row_number -------+---------+---------+------------ 1 | Wag | Dog | 1 1 | Wag | Dog | 2 2 | Scratch | Cat | 1 3 | Tweet | Bird | 1 4 | Bark | Dog | 1 4 | Bark | Dog | 2 4 | Bark | Dog | 3
PARTITION BY
क्लॉज FROM
. द्वारा निर्मित परिणाम सेट को विभाजित करता है विभाजन में खंड जिस पर फ़ंक्शन लागू होता है। जब हम परिणाम सेट के लिए विभाजन निर्दिष्ट करते हैं, तो प्रत्येक विभाजन नंबरिंग को फिर से शुरू करने का कारण बनता है (यानी प्रत्येक विभाजन में पहली पंक्ति के लिए नंबरिंग 1 से शुरू होगी)।
विकल्प 4
हम उपरोक्त क्वेरी का उपयोग सामान्य तालिका अभिव्यक्ति के रूप में मिलान करने वाले डुप्लिकेट से केवल अधिशेष पंक्तियों को वापस करने के लिए कर सकते हैं:
WITH cte AS
(
SELECT
*,
ROW_NUMBER() OVER (
PARTITION BY PetId, PetName, PetType
ORDER BY PetId, PetName, PetType
) AS Row_Number
FROM Pets
)
SELECT * FROM cte WHERE Row_Number <> 1;
परिणाम:
petid | petname | pettype | row_number -------+---------+---------+------------ 1 | Wag | Dog | 2 4 | Bark | Dog | 2 4 | Bark | Dog | 3