একটি SQL টেবিল মধ্যে সদৃশ মান খোঁজা




duplicates (20)

এক ক্ষেত্রের সাথে duplicates খুঁজে পাওয়া সহজ:

SELECT name, COUNT(email) 
FROM users
GROUP BY email
HAVING COUNT(email) > 1

তাই যদি আমরা একটি টেবিল আছে

ID   NAME   EMAIL
1    John   asd@asd.com
2    Sam    asd@asd.com
3    Tom    asd@asd.com
4    Bob    bob@asd.com
5    Tom    asd@asd.com

এই প্রশ্নটি আমাদের জন, স্যাম, টম, টমকে দেবে কারণ তাদের সকলের একই email

যাইহোক, আমি যা চাই তা একই email এবং name সাথে সদৃশ পেতে হয়।

অর্থাৎ, আমি "টম" পেতে চাই, "টম"।

আমার এই কারণটি দরকার: আমি ভুল করেছিলাম, এবং ডুপ্লিকেট name এবং email মূল্য সন্নিবেশ করার অনুমতি দিলাম। এখন আমাকে ডুপ্লিকেটগুলি সরিয়ে / পরিবর্তন করতে হবে, তাই আমাকে প্রথমে এটি সন্ধান করতে হবে।


এই কাজ করা উচিত, সম্ভবত এটি চেষ্টা করুন।

  Select * from Users a
            where EXISTS (Select * from Users b 
                where (     a.name = b.name 
                        OR  a.email = b.email)
                     and a.ID != b.id)

আপনার ক্ষেত্রে বিশেষ করে ভাল যদি আপনি অনুরূপ উপসর্গগুলির অনুসন্ধান করেন তবে কোনও প্রিফিক্স বা সাধারণ পরিবর্তন যেমন মেলের নতুন ডোমেন। তারপর আপনি এই কলামে প্রতিস্থাপন () ব্যবহার করতে পারেন


এই সহজ জিনিস আমি সঙ্গে আসা করেছি। এটি একটি সাধারণ টেবিল অভিব্যক্তি (CTE) এবং একটি পার্টিশন উইন্ডো ব্যবহার করে (আমার মনে হয় এই বৈশিষ্ট্যগুলি SQL 2008 এবং তার পরে)।

এই উদাহরণটি সদৃশ নাম এবং ডব সঙ্গে সমস্ত ছাত্র খুঁজে বের করে। ক্ষেত্র আপনি অনুলিপি জন্য চেক করতে চান ক্লায়েন্ট মধ্যে যান। আপনি অভিক্ষেপ করতে চান অন্য যে কোন ক্ষেত্র অন্তর্ভুক্ত করতে পারেন।

with cte (StudentId, Fname, LName, DOB, RowCnt)
as (
SELECT StudentId, FirstName, LastName, DateOfBirth as DOB, SUM(1) OVER (Partition By FirstName, LastName, DateOfBirth) as RowCnt
FROM tblStudent
)
SELECT * from CTE where RowCnt > 1
ORDER BY DOB, LName

আপনি যদি সদৃশ তথ্য (এক বা একাধিক মাপকাঠি অনুসারে) খুঁজে পেতে এবং প্রকৃত সারি নির্বাচন করতে চান।

with MYCTE as (
    SELECT DuplicateKey1
        ,DuplicateKey2 --optional
        ,count(*) X
    FROM MyTable
    group by DuplicateKey1, DuplicateKey2
    having count(*) > 1
) 
SELECT E.*
FROM MyTable E
JOIN MYCTE cte
ON E.DuplicateKey1=cte.DuplicateKey1
    AND E.DuplicateKey2=cte.DuplicateKey2
ORDER BY E.DuplicateKey1, E.DuplicateKey2, CreatedAt

http://developer.azurewebsites.net/2014/09/better-sql-group-by-find-duplicate-data/


select id,name,COUNT(*) from India group by Id,Name having COUNT(*)>1

আপনি যদি ডুপ্লিকেটগুলি মুছতে চান তবে এখানে ট্রিপল সাব-সিলেক্টর / অদ্ভুত সারি খুঁজে পাওয়ার চেয়ে এটি করার আরও সহজ উপায়:

SELECT id, name, email 
FROM users u, users u2
WHERE u.name = u2.name AND u.email = u2.email AND u.id > u2.id

এবং তাই মুছে ফেলার জন্য:

DELETE FROM users
WHERE id IN (
    SELECT id/*, name, email*/
    FROM users u, users u2
    WHERE u.name = u2.name AND u.email = u2.email AND u.id > u2.id
)

IMHO পড়তে এবং বুঝতে আরো অনেক সহজ

দ্রষ্টব্য: একমাত্র সমস্যা হল যে আপনি কোনও সারি মোছা না হওয়া পর্যন্ত অনুরোধটি চালাতে হবে, যেহেতু আপনি প্রতিটি সময় প্রতিলিপি মাত্র 1 টি মুছে ফেলেন


টেবিলের মধ্যে সদৃশ রেকর্ড পেতে কিভাবে

নম্বরটি নির্বাচন করুন (কোড), কর্মচারীদের কাছ থেকে কোড যেখানে স্থিতি = 1 নম্বর কোড দ্বারা কোড নম্বর (কোড)> 1


 SELECT name, email 
    FROM users
    WHERE email in
    (SELECT email FROM users
    GROUP BY email 
    HAVING COUNT(*)>1)

এটা চেষ্টা কর:

SELECT name, email
FROM users
GROUP BY name, email
HAVING ( COUNT(*) > 1 )

নীচে দেখানো হিসাবে আমরা সামগ্রিক ফাংশন যা কাজ এখানে থাকার ব্যবহার করতে পারেন

create table #TableB (id_account int, data int, [date] date)
insert into #TableB values (1 ,-50, '10/20/2018'),
(1, 20, '10/09/2018'),
(2 ,-900, '10/01/2018'),
(1 ,20, '09/25/2018'),
(1 ,-100, '08/01/2018')  

SELECT id_account , data, COUNT(*)
FROM #TableB
GROUP BY id_account , data
HAVING COUNT(id_account) > 1

drop table #TableB

এখানে দুটি ক্ষেত্র id_account এবং ডেটা ব্যবহার করা হয় গণনা (*) দিয়ে। সুতরাং, উভয় কলামে একই মানগুলির একাধিক বারের সমস্ত রেকর্ড দেওয়া হবে।

আমরা ভুলভাবে কিছু কারণ SQL সার্ভার টেবিলে যে কোনও সীমাবদ্ধতা যোগ করতে মিস করেছি এবং রেকর্ডগুলি সামনে-শেষ অ্যাপ্লিকেশন সহ সকল কলামে অনুলিপি সন্নিবেশ করা হয়েছে। তারপরে আমরা টেবিল থেকে অনুলিপি ক্যোয়ারী মুছে ফেলার জন্য নীচের অনুসন্ধান ব্যবহার করতে পারি।

SELECT DISTINCT * INTO #TemNewTable FROM #OriginalTable
TRUNCATE TABLE #OriginalTable
INSERT INTO #OriginalTable SELECT * FROM #TemNewTable
DROP TABLE #TemNewTable

এখানে আমরা অরিজিনাল টেবিলের সমস্ত স্বতন্ত্র রেকর্ড গ্রহণ করেছি এবং মূল টেবিলের রেকর্ড মুছে ফেলেছি। আবার আমরা নতুন টেবিলে থেকে সকল স্বতন্ত্র মানগুলি মূল সারণিতে সন্নিবেশ করলাম এবং তারপর নতুন টেবিল মুছে ফেলা হল।


নিম্নলিখিত চেষ্টা করুন:

SELECT * FROM
(
    SELECT Id, Name, Age, Comments, Row_Number() OVER(PARTITION BY Name, Age ORDER By Name)
        AS Rank 
        FROM Customers
) AS B WHERE Rank>1

এটি সদৃশ প্রতিটি গোষ্ঠী থেকে একটি রেকর্ড ব্যতীত সমস্ত সদৃশ রেকর্ড নির্বাচন / মুছে ফেলে। সুতরাং, মুছে ফেলা সমস্ত অনন্য রেকর্ড + সদৃশ প্রতিটি গ্রুপ থেকে একটি রেকর্ড পাতা।

সদৃশ নির্বাচন করুন:

SELECT *
FROM table
WHERE
    id NOT IN (
        SELECT MIN(id)
        FROM table
        GROUP BY column1, column2
);

সদৃশ মুছুন:

DELETE FROM table
WHERE
    id NOT IN (
        SELECT MIN(id)
        FROM table
        GROUP BY column1, column2
);

রেকর্ড বড় পরিমাণ সচেতন থাকুন, এটি কর্মক্ষমতা সমস্যা হতে পারে।


SELECT id, COUNT(id) FROM table1 GROUP BY id HAVING COUNT(id)>1;

আমি মনে করি এটি একটি নির্দিষ্ট কলামে পুনরাবৃত্তি মানের অনুসন্ধান করতে সঠিকভাবে কাজ করবে।


সিটিই ব্যবহার করে আমরা অনুরূপ সদৃশ মান খুঁজে পেতে পারি

with MyCTE
as
(
select Name,EmailId,ROW_NUMBER() over(PARTITION BY EmailId order by id) as Duplicate from [Employees]

)
select * from MyCTE where Duplicate>1

কিভাবে আমরা সদৃশ মান গণনা করতে পারেন ?? হয় এটা 2 বার বা তার চেয়ে বেশি 2 বার পুনরাবৃত্তি করা হয়।

মতই সহজ

select COUNT(distinct col_01) from Table_01

SELECT
  FirstName, LastName, MobileNo, COUNT(1) as CNT 
FROM        
  CUSTOMER
GROUP BY
  FirstName, LastName, MobileNo 
HAVING
  COUNT(1) > 1;

এটা চেষ্টা কর:

declare @YourTable table (id int, name varchar(10), email varchar(50))

INSERT @YourTable VALUES (1,'John','John-email')
INSERT @YourTable VALUES (2,'John','John-email')
INSERT @YourTable VALUES (3,'fred','John-email')
INSERT @YourTable VALUES (4,'fred','fred-email')
INSERT @YourTable VALUES (5,'sam','sam-email')
INSERT @YourTable VALUES (6,'sam','sam-email')

SELECT
    name,email, COUNT(*) AS CountOf
    FROM @YourTable
    GROUP BY name,email
    HAVING COUNT(*)>1

আউটপুট:

name       email       CountOf
---------- ----------- -----------
John       John-email  2
sam        sam-email   2

(2 row(s) affected)

যদি আপনি ডুপগুলির আইডিগুলি ব্যবহার করেন তবে এটি ব্যবহার করুন:

SELECT
    y.id,y.name,y.email
    FROM @YourTable y
        INNER JOIN (SELECT
                        name,email, COUNT(*) AS CountOf
                        FROM @YourTable
                        GROUP BY name,email
                        HAVING COUNT(*)>1
                    ) dt ON y.name=dt.name AND y.email=dt.email

আউটপুট:

id          name       email
----------- ---------- ------------
1           John       John-email
2           John       John-email
5           sam        sam-email
6           sam        sam-email

(4 row(s) affected)

সদৃশ মুছে ফেলার চেষ্টা করুন:

DELETE d
    FROM @YourTable d
        INNER JOIN (SELECT
                        y.id,y.name,y.email,ROW_NUMBER() OVER(PARTITION BY y.name,y.email ORDER BY y.name,y.email,y.id) AS RowRank
                        FROM @YourTable y
                            INNER JOIN (SELECT
                                            name,email, COUNT(*) AS CountOf
                                            FROM @YourTable
                                            GROUP BY name,email
                                            HAVING COUNT(*)>1
                                        ) dt ON y.name=dt.name AND y.email=dt.email
                   ) dt2 ON d.id=dt2.id
        WHERE dt2.RowRank!=1
SELECT * FROM @YourTable

আউটপুট:

id          name       email
----------- ---------- --------------
1           John       John-email
3           fred       John-email
4           fred       fred-email
5           sam        sam-email

(4 row(s) affected)

পার্টিতে একটু দেরী হলেও আমি সব ডুপ্লিকেট আইডি খুঁজে পেতে সত্যিই একটি দুর্দান্ত কাজকর্ম খুঁজে পেয়েছি:

SELECT GROUP_CONCAT( id )
FROM users
GROUP BY email
HAVING ( COUNT(email) > 1 )

আপনি যদি আপনার টেবিলে কোন অনুলিপি সারি দেখতে চান তবে আমি নীচের প্রশ্নটি ব্যবহার করেছি:

create table my_table(id int, name varchar(100), email varchar(100));

insert into my_table values (1, 'shekh', '[email protected]');
insert into my_table values (1, 'shekh', '[email protected]');
insert into my_table values (2, 'Aman', '[email protected]');
insert into my_table values (3, 'Tom', '[email protected]');
insert into my_table values (4, 'Raj', '[email protected]');


Select COUNT(1) As Total_Rows from my_table 
Select Count(1) As Distinct_Rows from ( Select Distinct * from my_table) abc 

SELECT * FROM users u where rowid = (select max(rowid) from users u1 where
u.email=u1.email);

SELECT column_name,COUNT(*) FROM TABLE_NAME GROUP BY column1, HAVING COUNT(*) > 1;





duplicates