یک جدول دارم که حدود 70 هزار رکورد داره. اما در این جدول برخی از رکوردها تکراری هستن. البته منظور از اینکه میگم تکراری نه اینکه کلید اصلی تکراری باشه. اطلاعات کاربر تکراری و چند بار ثبت شده.
با استفاده از دستور زیر می تونم لیست کاربرانی که اطلاعات تکراری دارن رو ببینم :
Select Count(*) As Cnt From UserPackage_Tbl
Where ActiveDeActive = 0
Group By UserID, PackageID
Having COUNT(*) > 1
و نتیجه هم در تصویر زیر مشاهده می کنید. همونطوری که در تصویر مشخصه اطلاعات برخی کاربران تا 7 بار هم تکراری ثبت شده. حالا من میخوام اطلاعات تکراری کاربر حذف بشه و فقط یک رکورد باقی بمونه از اطلاعات.
با یک مثال براتون حذف رکوردهای تکراری در 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 دارای اطلاعات تکراری هستند.
خب حالا میخوایم دستوری بنویسیم که همه رکوردهای تکراری به جز یک رکورد را حذف کند. مثلا بین رکوردهای 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 رو حذف کردیم.
تاریخ :
1402/07/23
- ساعت :
04:01:00 PM
- بازدید :
1031
- پاسخ :
1
|
تاریخ :
1400/08/02
- ساعت :
02:35:00 PM
- بازدید :
2563
- پاسخ :
1
|
تاریخ :
1403/01/15
- ساعت :
04:12:00 PM
- بازدید :
799
- پاسخ :
2
|
تاریخ :
1402/10/18
- ساعت :
10:45:00 PM
- بازدید :
705
- پاسخ :
2
|
تاریخ :
1402/08/18
- ساعت :
08:43:00 AM
- بازدید :
1311
- پاسخ :
0
|
تاریخ :
1402/08/16
- ساعت :
09:45:00 PM
- بازدید :
1037
- پاسخ :
1
|
تاریخ :
1402/06/27
- ساعت :
12:27:00 PM
- بازدید :
1459
- پاسخ :
2
|
تاریخ :
1402/06/25
- ساعت :
11:37:00 AM
- بازدید :
1041
- پاسخ :
1
|
تاریخ :
1402/06/18
- ساعت :
10:36:00 AM
- بازدید :
1751
- پاسخ :
2
|
تاریخ :
1399/06/01
- ساعت :
10:58:00 PM
- بازدید :
7553
- پاسخ :
1
|
تاریخ :
1403/08/29
- ساعت :
07:15:00 PM
- بازدید :
57
- پاسخ :
0
|
تاریخ :
1403/08/18
- ساعت :
10:40:00 AM
- بازدید :
97
- پاسخ :
0
|
تاریخ :
1402/07/23
- ساعت :
04:01:00 PM
- بازدید :
1031
- پاسخ :
1
|
تاریخ :
1403/05/30
- ساعت :
09:22:00 AM
- بازدید :
426
- پاسخ :
1
|
تاریخ :
1402/08/01
- ساعت :
06:25:00 PM
- بازدید :
930
- پاسخ :
1
|
تاریخ :
1402/08/16
- ساعت :
10:38:00 AM
- بازدید :
1347
- پاسخ :
1
|
تاریخ :
1398/08/17
- ساعت :
01:27:00 AM
- بازدید :
4796
- پاسخ :
1
|
تاریخ :
1402/09/08
- ساعت :
07:34:00 PM
- بازدید :
1157
- پاسخ :
1
|
تاریخ :
1402/09/21
- ساعت :
11:10:00 PM
- بازدید :
595
- پاسخ :
1
|
تاریخ :
1403/07/27
- ساعت :
03:21:00 PM
- بازدید :
205
- پاسخ :
1
|