使用 Oracle 更改具有较高日期的所有重复项的字段值

changing a value of a field for all duplicates with higher date using Oracle

我想识别一个字段中的重复项并将另一个字段的值更改为 all late on id dups。例如:

---------------------------------------------------
id    |   color     |    ref   |   date
---------------------------------------------------
 1    |   orange    |    0     |   20200101
 2    |   orange    |    0     |   20200102
 3    |   black     |    0     |   20200117
 4    |   red       |    0     |   20200202
 5    |   black     |    0     |   20200104
 6    |   black     |    0     |   20200115
 7    |   red       |    0     |   20200101
 8    |   orange    |    0     |   20200210

以上table只是一个例子:我想根据颜色字段识别重复项并将所有具有较晚日期的重复项更新为ref = 1

SELECT *
from colorful
where (color) in
    (SELECT color
    from colorful
    group by color
    HAVING COUNT(*) > 1
    )
ORDER BY color;

如何编写更新语句来执行上述操作,因为我尝试了几次但未能成功

MERGE 可以是一个选项。

示例数据:

SQL> alter session set nls_Date_Format = 'yyyy-mm-dd';

Session altered.

SQL> select * from test order by color, datum;

        ID COLOR         REF DATUM
---------- ------ ---------- ----------
         5 black           0 2020-01-04
         6 black           0 2020-01-15
         3 black           0 2020-01-17
         1 orange          0 2020-01-01
         2 orange          0 2020-01-02
         8 orange          0 2020-02-10
         7 red             0 2020-01-01
         4 red             0 2020-02-02
         9 white           0 2020-03-15

9 rows selected.

让我们将所有 REF 更新为 1,如果存在日期列的值不是该颜色的最小值的重复项。

SQL> merge into test t
  2    using (select color, min(datum) min_datum
  3           from test
  4           group by color
  5          ) x
  6    on (x.color = t.color)
  7  when matched then update set
  8    t.ref = 1
  9    where t.datum > x.min_datum;

5 rows merged.

SQL> select * From test order by color, datum;

        ID COLOR         REF DATUM
---------- ------ ---------- ----------
         5 black           0 2020-01-04
         6 black           1 2020-01-15
         3 black           1 2020-01-17
         1 orange          0 2020-01-01
         2 orange          1 2020-01-02
         8 orange          1 2020-02-10
         7 red             0 2020-01-01
         4 red             1 2020-02-02
         9 white           0 2020-03-15

9 rows selected.

SQL>