我想更改Version列的值并將其從 '0' 填充到每個Project_ID遞增并按CreatedDate排序的值。這將在 Oracle 中,它用于現有行,而不是插入時的 auto_increment。
前
| 專案_ID | 版本 | 創建日期 |
|---|---|---|
| 1 | 0 | 2011 年 6 月 1 日 |
| 2 | 0 | 2011 年 6 月 1 日 |
| 1 | 0 | 2011 年 6 月 2 日 |
| 2 | 0 | 2011 年 6 月 2 日 |
| 1 | 0 | 2011 年 6 月 3 日 |
| 2 | 0 | 2011 年 6 月 3 日 |
| 3 | 0 | 2011 年 6 月 4 日 |
| 1 | 0 | 2011 年 6 月 4 日 |
首選結果
| 專案_ID | 版本 | 創建日期 |
|---|---|---|
| 1 | 1 | 2011 年 6 月 1 日 |
| 2 | 1 | 2011 年 6 月 1 日 |
| 1 | 2 | 2011 年 6 月 2 日 |
| 2 | 2 | 2011 年 6 月 2 日 |
| 1 | 3 | 2011 年 6 月 3 日 |
| 2 | 3 | 2011 年 6 月 3 日 |
| 3 | 1 | 2011 年 6 月 4 日 |
| 1 | 4 | 2011 年 6 月 4 日 |
還沒有嘗試任何東西,如果我要做一個簡單的
UPDATE table_name SET version = version 1 GROUP BY project_id
我不認為它會奏效
uj5u.com熱心網友回復:
您可以row_number()over(partition by Project_ID order by created_date)為此使用決議函式。不幸的是,您不能在
update (select ...,analytic_function()... from t)
set val=new_val
但是您可以merge為此使用陳述句:
merge into t
using (
select rowid rid, row_number()over(partition by Project_ID order by created_date) new_value
from t
) new_t
on (t.rowid = new_t.rid)
when matched then
update set Version = new_value;
DBFiddle:https ://dbfiddle.uk/ ? rdbms = oracle_18 & fiddle = e778bb0b43e6fcc0ce6961d3a7887cd6
uj5u.com熱心網友回復:
如果某些列具有唯一值,則可以在沒有 row_number 的情況下完成。
所以假設沒有主鍵,并且有一個具有唯一時間值的 Created_Date。
update yourtable t set Version = ( select count(*) from yourtable t2 where t2.Project_ID = t.Project_ID and t2.Created_Date <= t.Created_Date );
8 行受影響
select * from yourtable身份證 | PROJECT_ID | 版本 | 創建日期 -: | ---------: | ------: | :----------- 1 | 1 | 1 | 21 年 8 月 18 日 2 | 2 | 1 | 21 年 8 月 19 日 3 | 1 | 2 | 20-8-21 4 | 2 | 2 | 21 年 8 月 21 日 5 | 1 | 3 | 21 年 8 月 22 日 6 | 2 | 3 | 21 年 8 月 23 日 7 | 3 | 1 | 24 年 8 月 21 日 8 | 1 | 4 | 25 年 8 月 21 日
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/366510.html
下一篇:基于列值拆分行的遞回CTE
