根据大于另一行中的值的最小值插入值

Insert value based on min value greater than value in another row

标题中的问题很难解释清楚。

我从一行中(或基于其中的值)插入 6 个值。 我还需要从第二行插入一个值,其中:

  1. 一列 (ID) 中的值必须相等
  2. 主源行中列 (CODE) 中的值必须为 IN (100,200),而另一行的值必须为 300 或 400
  3. 次要行中另一列 (OBJID) 中的值必须是高于主要行中的最小值。

来源 Table 看起来像:

OBJID | CODE | ENTRY_TIME | INFO | ID | USER
---------------------------------------------
   1  | 100  | x timestamp| .... | 10 |  X
   2  | 100  | y timestamp| .... | 11 |  Y
   3  | 300  | z timestamp| .... | 10 |  F
   4  | 100  | h timestamp| .... | 10 |  X
   5  | 300  | g timestamp| .... | 10 |  G

所以举个例子.. 在我的第二个 table 中,我想插入 OBJIDOBJID2CODEENTRY_TIMEsubstr(INFO(...))IDUSER

即在我的示例中,第二个 table 中插入的一行看起来像:

OBJID | OBJID2 | CODE | ENTRY_TIME | INFO      | ID | USER
-----------------------------------------------------------
   1  |    3   | 100  | x timestamp| substring | 10 |  X
   4  |    5   | 100  | h timestamp| substring2| 10 |  X

我对来自一行的所有内容的插入工作正常。

INSERT INTO TABLE2
(ID, OBJID, INFO, USER, ENTRY_TIME)
SELECT ID, OBJID, DECODE(CODE, 100, (SUBSTR(INFO, 12, 
LENGTH(INFO)-27)),                                                           
600,'CREATE') INFO, USER, ENTRY_TIME
FROM TABLE1
WHERE CODE IN (100,200);

我知道我需要在 TABLE1 上使用别名,但我不知道如何让其余部分工作,尤其是以有效的方式。现在有 200 万行,但一旦我开始使用生产数据,将会有接近 2000 万行。

好的,我想出了:

select  OBJID, 
        min(case when code in (300,400) then  objid end) 
          over (partition by id order by objid 
                range between 1  following and unbounded following
                ) objid2,
        CODE, ENTRY_TIME, INFO, ID, USER1
from table1;

因此,您需要 insert select 上面的查询,其中包含 where objid2 is not null 和代码 (100,200);

你可以试试这个:

select primary.* ,
    (select min(objid)
    from table1 secondary
    where primary.objid < secondary.objid 
        and secondary.code in (300,400) 
        and primary.id = secondary.id
    ) objid2
from table1 primary
where primary.code in (100,200);