使用sql中的最新时间更新表



我是SQL的新手,无法解决这种情况。

我有这张桌子:

Number      code    d_date 
---------------------------------------
2054330994  SP41   11/23/2020 10:14:43
2054330994  SP41   11/23/2020 10:14:44
2054330994  SP41   11/23/2020 10:14:45
2054330994  SP41   11/23/2020 10:14:46
2054330994  SP41   11/23/2020 10:14:47
2054330994  SP41   11/23/2020 10:14:48
2054330994  SP41   11/23/2020 10:14:49
2054330994  SP41   11/23/2020 10:14:49
2054330994  SP41   11/23/2020 10:14:49
2054330994  SP41   11/23/2020 10:14:43
2054330995  SP41   11/23/2020 10:14:43
2054330995  SP41   11/23/2020 10:14:52
2054330995  SP41   11/23/2020 10:14:43
2054330995  SP41   11/23/2020 10:14:52
2054330995  SP41   11/23/2020 10:14:52

预期结果:

2054330994  SP41   11/23/2020 10:14:49
2054330995  SP41   11/23/2020 10:14:52

我们可以看到有许多重复的条目。

我的问题是:我需要保留d_date最新输入的号码。剩下的条目和这个数字有关,我们需要从同一个表中删除。

对不起,我不能继续做下去。

提前谢谢。

要在没有重复数据的情况下进行查询,可以在Number&代码

SELECT "Number", code
, MAX(d_date) AS d_date
FROM your_table
GROUP BY "Number", code
ORDER BY "Number", code

或者使用ROW_NUMBER

SELECT "Number", code, d_date
FROM
(
SELECT "Number", code, d_date
, ROW_NUMBER() OVER (PARTITION BY "Number", code ORDER BY d_date DESC) AS rn
FROM your_table
) q
WHERE rn = 1
ORDER BY "Number", code;

要从表中删除重复数据,还可以使用row_number。

DELETE 
FROM your_table
WHERE rowid IN (
SELECT rowid
FROM (
SELECT "Number", code, d_date
, ROW_NUMBER() OVER (PARTITION BY "Number", code 
ORDER BY d_date DESC) AS rn
FROM your_table
) q WHERE rn > 1
);
SELECT *
FROM your_table
ORDER BY "Number", code, d_date
编号代码
2054330994SP412011年11月23日
2054330995SP412011年11月23日,10.14.52.000000

如您所说,从表中删除:

之前:

SQL> select * from test order by num, code, d_date;
NUM CODE D_DATE
---------- ---- --------------------
994 SP41 11/23/2020 10:14:43
994 SP41 11/23/2020 10:14:43
994 SP41 11/23/2020 10:14:46
994 SP41 11/23/2020 10:14:49
994 SP41 11/23/2020 10:14:49
995 SP41 11/23/2020 10:14:43
995 SP41 11/23/2020 10:14:52
995 SP41 11/23/2020 10:14:52
995 SP41 11/23/2020 10:14:52
9 rows selected.

删除:

SQL> delete from test a
2    where a.rowid not in
3              (select rowid
4                 from (select row_number () over (partition by num, code
5                                                  order by d_date desc) rn,
6                              rowid
7                       from test
8                      )
9                where rn = 1
10              );
7 rows deleted.

之后:

SQL> select * from test order by num, code, d_date;
NUM CODE D_DATE
---------- ---- --------------------
994 SP41 11/23/2020 10:14:49
995 SP41 11/23/2020 10:14:52
SQL>

我已经尝试了下面的查询,它似乎按预期工作。

DELETE FROM table_name WHERE d_date != (SELECT MAX(t2.d_date) FROM table_name t2 WHERE t2.number = table_name.number);

我不知道在哪种情况下它会失败,但截至目前,根据我目前的情况,它正在按预期工作。

最新更新