我是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
编号 代码 2054330994 SP41 2011年11月23日 2054330995 SP41 2011年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);
我不知道在哪种情况下它会失败,但截至目前,根据我目前的情况,它正在按预期工作。