【问题标题】:Update the table with latest time in sql用sql中的最新时间更新表
【发布时间】:2021-12-29 12:10:21
【问题描述】:

我是 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 最新输入的号码。我们需要从同一张表中删除与此号码相关的剩余条目。

对不起,我无法继续。

提前致谢。

【问题讨论】:

  • 样本数据很好,但您还需要指定预期结果。
  • 完全正确;结果是只有一行(具有最新的 D_DATE)还是 8 行(因为只有最后 3 行是“重复的”,但您想保留前 7 行的时间不重复)?另外,您是否需要将其作为 SELECT,或者您想从表中删除不需要的行?
  • 既然您知道预期结果是什么,请编辑您的问题并指定它!
  • 如果重复出现在最大日期值处怎么办?
  • 在样本数据中添加一些具有不同数字和代码值的行,并调整预期结果(如果需要)。

标签: sql oracle


【解决方案1】:

要在没有重复数据的情况下进行查询,您可以在 Number & code 上聚合

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;

要从表中删除 dups,也可以使用 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
Number CODE D_DATE
2054330994 SP41 23-NOV-20 10.14.49.000000
2054330995 SP41 23-NOV-20 10.14.52.000000

dbfiddle here

上的演示

【讨论】:

  • "我们需要从同一个表中删除与此数字相关的剩余条目。" 让我怀疑 OP 可能想要 DELETE 行。
  • 好的,还不确定,但你可能是对的。
  • @jarlh 我们要删除剩余的行
  • @CrazyCoder 包含一个 DELETE 语句。
  • 您可以使查询更简单db<>fiddle,因为您无需选择所有其他列,也无需为子查询提供您从未使用过的别名。
【解决方案2】:

如你所说,从表中删除:

之前:

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>

【讨论】:

    【解决方案3】:

    我已尝试以下查询,它似乎按预期工作。

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

    我不知道在哪种情况下它会失败,但到目前为止,就我目前的情况而言,它正在按预期工作。

    【讨论】:

    • 我不同意。您的查询将保留 D_DATE 列等于 MAX(D_DATE) 每个 NUMBER 的所有(重复)行(顺便说一句,多么不幸的列名;它是为数据类型保留的,因此您不能将其用作列名)。您期望的结果是每个数字只有两行。因此,要么您迄今为止发布的内容具有误导性(并且对社区不公平),要么您发布的查询是错误的(我是对的)。
    猜你喜欢
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    相关资源
    最近更新 更多