如何删除具有一个唯一列的重复记录
How to delete duplicate record which has one unique column
我有一个table这样的。
如何删除月值较大的记录 "Jimmy" 和 "Kenneth"。
谢谢。
delete from tablename t1 where exists (select 1 from tablename t2
where t1.name = t2.name
and t1.month > t2.month)
但是为什么不考虑年份呢?为什么不使用日期数据类型?
如果同一个月有两个吉米怎么办?
如果不允许重复,为什么没有唯一约束?
使用CTE
删除重复记录
;with cte as
(
select Rn=row_number()over(partition by name,post order by month ASC),*
from yourtable
)
delete from cte where rn>1
如果月份是一列数字,试试这个:
DELETE table
WHERE month = (SELECT Max(month)
FROM table
WHERE name = 'Jimmy')
AND name = 'Jimmy';
DELETE table
WHERE month = (SELECT Max(month)
FROM table
WHERE name = 'Kenneth')
AND name = 'Kenneth';
您可以使用over partition来分隔月份中的最大值:
SELECT *
FROM (SELECT *,
Row_number()OVER(PARTITION BY name, Post
ORDER BY Month DESC) AS RowNumber
FROM TABLE)
WHERE rownumber = 1
使用此代码..
WITH tblTemp as(SELECT ROW_NUMBER() Over(PARTITION BY Name,Post ORDER BY Name)As RowNumber,* FROM <table_name>)DELETE FROM tblTemp where RowNumber >1
我有一个table这样的。
如何删除月值较大的记录 "Jimmy" 和 "Kenneth"。
谢谢。
delete from tablename t1 where exists (select 1 from tablename t2
where t1.name = t2.name
and t1.month > t2.month)
但是为什么不考虑年份呢?为什么不使用日期数据类型? 如果同一个月有两个吉米怎么办? 如果不允许重复,为什么没有唯一约束?
使用CTE
删除重复记录
;with cte as
(
select Rn=row_number()over(partition by name,post order by month ASC),*
from yourtable
)
delete from cte where rn>1
如果月份是一列数字,试试这个:
DELETE table
WHERE month = (SELECT Max(month)
FROM table
WHERE name = 'Jimmy')
AND name = 'Jimmy';
DELETE table
WHERE month = (SELECT Max(month)
FROM table
WHERE name = 'Kenneth')
AND name = 'Kenneth';
您可以使用over partition来分隔月份中的最大值:
SELECT *
FROM (SELECT *,
Row_number()OVER(PARTITION BY name, Post
ORDER BY Month DESC) AS RowNumber
FROM TABLE)
WHERE rownumber = 1
使用此代码..
WITH tblTemp as(SELECT ROW_NUMBER() Over(PARTITION BY Name,Post ORDER BY Name)As RowNumber,* FROM <table_name>)DELETE FROM tblTemp where RowNumber >1