دسته بندی ها
16:07 1401/02/04

حذف ردیف های تکراری در Sql Server با استفاده از Group By

مشخصات سوال کننده :
کاربر : pedram_khan     امتیاز کاربر : 277     رتبه کاربر : 6
دسته بندی : Sql Server

به این سوال امتیاز بدهید    0
تعداد بازدید این سوال : 6185
پاسخ دهنده : saedbfd 16:42 1401/02/04

با یک مثال براتون حذف رکوردهای تکراری در Sql Server رو توضیح میدم که برای سایر دوستان هم قابل استفاده باشه.

حذف سطرهای تکراری در sql server

 

در ابتدا فرض کنید که یک جدول به نام UserPackage_Tbl داریم. (هم نام با جدولی که شما در کدهای خودتون قرار دادید. ستونهایی که هم که در این جدول تعریف می کنیم هم نام با جدول خودتون قرار میدیم.)

CREATE TABLE UserPackage_Tbl(
    UserPackageID INT IDENTITY(1,1) PRIMARY KEY,
    UserId NVARCHAR(100) NOT NULL,
    PackageId int NOT NULL,
    ActiveDeActive tinyint NOT NULL,
);

خب حالا توسط دستورات زیر چند رکورد در این جدول ثبت می کنیم. دقت کنید برخی از این رکوردها دارای اطلاعات تکراری هستند که قرار است در ادامه این رکوردها را حذف کنیم.

INSERT INTO UserPackage_Tbl
    (UserId,PackageId,ActiveDeActive) 
VALUES
    ('19','5','0'),
    ('17','8','1'),
    ('36','9','0'),
    ('36','9','0'),
    ('36','9','0'),
    ('25','12','0'),
    ('25','12','0'),
    ('12','14','1'),
    ('12','14','0'),
    ('18','87','1');

 

خب حالا توسط دستور Select اطلاعات جدول را نمایش می دهیم :

Select * From UserPackage_Tbl

تصویر زیر اطلاعات جدول را نمایش می دهد. هم چنین مشاهده می کنید که ردیف هایی با Id برابر 3 و 4 و 5 و همچنین ردیف هایی با Id برابر 6 و 7 دارای اطلاعات تکراری هستند.

delete duplicated rows in sql server

خب حالا میخوایم دستوری بنویسیم که همه رکوردهای تکراری به جز یک رکورد را حذف کند. مثلا بین رکوردهای 3 و 4 و 5 گزینه های 3 و 4 حذف شود و گزینه 5 باقی بماند. در واقع می خواهیم اطلاعات تکراری نداشته باشیم.

WITH cte AS (
    SELECT 
        *, 
        ROW_NUMBER() OVER (
            PARTITION BY 
                userid, 
                packageid
            ORDER BY 
                userid, 
                packageid 
        ) row_num
     FROM 
        UserPackage_Tbl2 Where ActiveDeActive = 0
)
DELETE FROM cte
WHERE row_num > 1;

توسط دستور بالا به راحتی رکوردهای تکراری حذف میشن. در این کوئری از Row_Number که یک متد برای دسته بندی و شماره گذاری رکوردها هست استفاده کردیم. رکوردهای تکراری بر اساس userId و packageId پیدا میشن و شماره های بالاتر از 1 رو میگیرن. و در ادامه شماره های بالاتر از 1 رو حذف کردیم.

به این پاسخ امتیاز بدهید    3
امتیاز: 1654 رتبه: 1
1 نظر
taqech : واقعا عالی بود مشکل بزرگی از من حل کرد.

امتیاز کاربر : 10   رتبه کاربر : 70   تاریخ ثبت : 10:52 1401/10/11
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود