изменение значения поля для всех дубликатов с более высокой датой, используя Oracle - PullRequest
1 голос
/ 02 апреля 2020

Я хотел бы идентифицировать дубликаты в поле и изменить значение другого поля на все поздние при идентификаторах. например:

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

приведенная выше таблица является лишь примером: я хотел бы определить дубликат в зависимости от поля цвета и обновить все дубликаты с более поздними датами до ref = 1

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

Как написать заявление об обновлении, чтобы выполнить вышеизложенное, как я пытался несколько раз и не смог сделать это успешно

1 Ответ

1 голос
/ 02 апреля 2020

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 s до 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...