使用 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>
我想识别一个字段中的重复项并将另一个字段的值更改为 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>