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




duplicates (17)

এক ক্ষেত্রের সাথে 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 মূল্য সন্নিবেশ করার অনুমতি দিলাম। এখন আমাকে ডুপ্লিকেটগুলি সরিয়ে / পরিবর্তন করতে হবে, তাই আমাকে প্রথমে এটি সন্ধান করতে হবে।


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

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 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 টি মুছে ফেলেন


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

  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)

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


এই কোড চেষ্টা করুন

WITH CTE AS

( SELECT Id, Name, Age, Comments, RN = ROW_NUMBER()OVER(PARTITION BY Name,Age ORDER BY ccn)
FROM ccnmaster )
select * from CTE 

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

SELECT name, email
FROM users
GROUP BY name, email
HAVING ( COUNT(*) > 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)

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

মতই সহজ

select COUNT(distinct col_01) from Table_01

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

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 GROUP_CONCAT( id )
FROM users
GROUP BY email
HAVING ( COUNT(email) > 1 )

যদি আপনি ওরাকলের সাথে কাজ করেন তবে এই পদ্ধতিটি আরও ভাল হবে:

create table my_users(id number, name varchar2(100), email varchar2(100));

insert into my_users values (1, 'John', '[email protected]');
insert into my_users values (2, 'Sam', '[email protected]');
insert into my_users values (3, 'Tom', '[email protected]');
insert into my_users values (4, 'Bob', '[email protected]');
insert into my_users values (5, 'Tom', '[email protected]');

commit;

select *
  from my_users
 where rowid not in (select min(rowid) from my_users group by name, email);

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

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


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

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


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

শুধু কলাম উভয় গ্রুপ।

দ্রষ্টব্য: পুরোনো এএনএসআই মানটি GROUP BY তে সমস্ত অ-সংহত কলাম থাকতে হবে তবে এটি "কার্যকরী নির্ভরতা" ধারণা দিয়ে পরিবর্তিত হয়েছে:

রিলেশনাল ডাটাবেস তত্ত্বের মধ্যে, একটি কার্যকরী নির্ভরতা একটি ডাটাবেসের সম্পর্কের বৈশিষ্ট্যের দুটি সেটের মধ্যে একটি সীমাবদ্ধতা। অন্য কথায়, কার্যকরী নির্ভরতা একটি সীমাবদ্ধতা যা সম্পর্কের বৈশিষ্ট্যগুলির মধ্যে সম্পর্ককে বর্ণনা করে।

সমর্থন সামঞ্জস্যপূর্ণ নয়:

  • সাম্প্রতিক PostgreSQL এটি সমর্থন করে
  • এসকিউএল সার্ভার (যেমন এসকিউএল সার্ভার ২0177 এ) GROUP BY এর সমস্ত অ-সংহত কলামগুলির জন্য এখনও প্রয়োজন।
  • MySQL অনির্দেশ্য এবং আপনাকে sql_mode=only_full_group_by প্রয়োজন:
  • ওরেকল যথেষ্ট মূলধারার নয় (সতর্কতা: হাস্যকর, আমি ওরাকল সম্পর্কে জানি না)।

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

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

select name, email
, case 
when ROW_NUMBER () over (partition by name, email order by name) > 1 then 'Yes'
else 'No'
end "duplicated ?"
from users

 select emp.ename, emp.empno, dept.loc 
          from emp
 inner join dept 
          on dept.deptno=emp.deptno
 inner join
    (select ename, count(*) from
    emp
    group by ename, deptno
    having count(*) > 1)
 t on emp.ename=t.ename order by emp.ename
/




duplicates