如何更新下表?

时间:2018-07-26 17:46:28

标签: sql oracle oracle11g sql-update

我具有以下显示的数据集(Oracle 11)。最终目标是根据INCCOLX列将{strong>仅的每个记录中的一个记录更新为{strong>仅,而将所有其他记录都更新为1 COL3COLX的子组应根据以下规则获得0:

对于COL3COL3中的每个不同值,例如 M1 1 ,我只需要根据COLX中的最早日期将单个记录设置为1(在三个,K1,K2和K0中) ,如果它们是同一日期,则根据COL2的顺序获取行,例如在这种情况下是 K1 K2 K0

但是,在此之前,我还需要考虑另一条规则,即COL1的值是否小于某个值,例如 16 ,则记录应为COL4(请注意,我并不是说INC=1是否应具有最小值,而是要满足COL4的条件)。对于COL4 < 16,前两个记录的值分别为 10 12 ,因此应将其视为与 K0 相对的值具有COL3=M

将所有内容放在一起,如果记录的值为COL4=17COL3=M1,则 K2 应该为1,而其余子集 K1 >和 K0 ,应该为0。

或者在COLX=1COL3=D1的情况下, K0 应该得到COLX=1,而另外两个 K1 K2 ,因为所有INC=1都应获得INC=0,并且 K2 K0 最早的{{1} }日期,但 K0 得到COL4 < 16,因为订购 K2 K0 时, K0 排在最前面

COL2

请记住,这是一个INC=1操作。我尝试用超前和滞后进行分区,但是无法正常工作。

1 个答案:

答案 0 :(得分:1)

假设您有某种方法可以唯一地标识每个组中的给定行,则可以使用order by和子查询来标识该行。如果inc在所有行中都以0开头,则可以将值设置为1

假设唯一行是(date, col4),则查询如下所示:

update t
    set inc = 1
    where (date, col4) = (select date, col4
                          from t t2
                          where t2.colx = t.colx and t2.col3 = t.col3
                          order by (case when col4 < 16 then 1 else 2 end),
                                   date asc, col4
                          fetch first 1 row only
                         );

您可以根据需要调整列。

Oracle 11g支持fetch first子句。这很方便。在旧版本的Oracle中,查询有些棘手。