Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 如何删除SQL中具有较旧日期字段的重复行_Database_Oracle_Stored Procedures - Fatal编程技术网

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列。