【问题标题】:Increment value by one for each project每个项目加一
【发布时间】:2022-01-04 03:10:56
【问题描述】:

我想更改 Version 列的值并将其从“0”填充为按 Project_ID 递增并按 CreatedDate 排序的值.这将在 Oracle 中,它用于现有行而不是插入时 auto_increment。

之前

Project_ID Version CreatedDate
1 0 Jun-1-2011
2 0 Jun-1-2011
1 0 Jun-2-2011
2 0 Jun-2-2011
1 0 Jun-3-2011
2 0 Jun-3-2011
3 0 Jun-4-2011
1 0 Jun-4-2011

首选结果

Project_ID Version CreatedDate
1 1 Jun-1-2011
2 1 June-1-2011
1 2 Jun-2-2011
2 2 Jun-2-2011
1 3 Jun-3-2011
2 3 Jun-3-2011
3 1 Jun-4-2011
1 4 Jun-4-2011

还没有尝试过,如果我要做一个简单的

UPDATE table_name SET version = version+1  GROUP BY project_id 

我不认为它会起作用

【问题讨论】:

  • 你有什么尝试?
  • 编辑感谢。
  • 您应该有一列用于排序...您将如何决定哪些行应该获得更高版本?
  • 我认为你可以使用 RANK
  • @SayanMalakshinov 150%,这就是我要求尝试的原因。只有 2 列似乎不太合乎逻辑。我仍然认为需要调试或澄清数据

标签: sql oracle increment


【解决方案1】:

您可以为此使用解析函数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

【讨论】:

  • 谢谢你,我觉得小提琴很好用。编辑:我是个假人没有更新别名。
【解决方案2】:

如果某些列具有唯一值,则可以在没有 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
身份证 |项目 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 | 21 年 8 月 24 日 8 | 1 | 4 | 21 年 8 月 25 日

db小提琴here

【讨论】:

  • 谢谢你,我得去看看!
  • 如果您查看小提琴,那么您会注意到它还包含一个合并。如果它只按版本排序,它甚至可以工作。但那将是随机的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-25
  • 1970-01-01
  • 2012-03-24
  • 2015-10-11
  • 1970-01-01
  • 2021-12-22
相关资源
最近更新 更多