Database 如何删除SQL中具有较旧日期字段的重复行
我的表中有两行是完全重复的,除了日期字段。我希望通过比较日期来找到这些记录并删除旧记录 例如,我有以下数据Database 如何删除SQL中具有较旧日期字段的重复行,database,oracle,stored-procedures,Database,Oracle,Stored Procedures,我的表中有两行是完全重复的,除了日期字段。我希望通过比较日期来找到这些记录并删除旧记录 例如,我有以下数据 ctrc_num | Ctrc_name | some_date --------------------------------------- 12345 | John R | 2011-01-12 12345 | John R | 2012-01-12 56789 | Sam S | 20
ctrc_num | Ctrc_name | some_date
---------------------------------------
12345 | John R | 2011-01-12
12345 | John R | 2012-01-12
56789 | Sam S | 2011-01-12
56789 | Sam S | 2012-01-12
现在的想法是找到具有不同“some_date”字段的重复项,并删除旧记录。最终输出应该是这样的
ctrc_num | Ctrc_name | some_date
---------------------------------------
12345 | John R | 2012-01-12
56789 | Sam S | 2012-01-12
还要注意的是,我的表没有主键,它最初是以这种方式创建的,不知道为什么,它必须放在存储过程中 这是针对SQL Server的
CREATE TABLE StackOverFlow
([ctrc_num] int, [Ctrc_name] varchar(6), [some_date] datetime)
;
INSERT INTO StackOverFlow
([ctrc_num], [Ctrc_name], [some_date])
SELECT 12345, 'John R', '2011-01-12 00:00:00' UNION ALL
SELECT 12345, 'John R', '2012-01-12 00:00:00' UNION ALL
SELECT 56789, 'Sam S', '2011-01-12 00:00:00' UNION ALL
SELECT 56789, 'Sam S', '2012-01-12 00:00:00'
;WITH RankedByDate AS
(
SELECT ctrc_num
,Ctrc_name
,some_date
,ROW_NUMBER() OVER(PARTITION BY Ctrc_num, Ctrc_name ORDER BY some_date DESC) AS rNum
FROM StackOverFlow
)
DELETE
FROM RankedByDate
WHERE rNum > 1
SELECT
[ctrc_num]
, [Ctrc_name]
, [some_date]
FROM StackOverFlow
下面是测试它的sql小提琴
我想在这里做的是
按日期降序排列记录
删除旧的保留最新的
如果你看这个:
SELECT * FROM <tablename> WHERE some_date IN
(
SELECT MAX(some_date) FROM <tablename> GROUP BY ctrc_num,ctrc_name
HAVING COUNT(ctrc_num) > 1
AND COUNT(ctrc_name) > 1
)
您可以看到它为重复的行选择了两个最近的日期。如果我将括号中的select切换为“min date”并使用它删除,则您将删除重复行的两个较旧日期
DELETE FROM <tablename> WHERE some_date IN
(
SELECT MIN(some_date) FROM <tablename> GROUP BY ctrc_num,ctrc_name
HAVING COUNT(ctrc_num) > 1
AND COUNT(ctrc_name) > 1
)
你应该选择1。你确定你需要MySQL、SQL Server和Oracle的解决方案吗?我只需要Oracle的解决方案。如何删除标记?单击“编辑”,然后删除标记,因为之前没有提到这一点,但我只需要针对Oracle数据库的解决方案。我得到一个缺少的select关键字错误。不过,逻辑是完美的。对于Oracle来说,这里有一个类似的问题-这是否解释了表中缺少主键的原因?当然,Aasim没有主键的替代品,因为这将使每一行都具有唯一性,并使任何重复数据消除都更加有效,问题是,我们不知道是否有主键,我们只显示了3列。