我具有以下显示的数据集(Oracle 11)。最终目标是根据INC
和COLX
列将{strong>仅的每个记录中的一个记录更新为{strong>仅,而将所有其他记录都更新为1 COL3
和COLX
的子组应根据以下规则获得0:
对于COL3
和COL3
中的每个不同值,例如 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=17
和COL3=M1
,则 K2 应该为1,而其余子集 K1 >和 K0 ,应该为0。
或者在COLX=1
和COL3=D1
的情况下, K0 应该得到COLX=1
,而另外两个 K1 和 K2 ,因为所有INC=1
都应获得INC=0
,并且 K2 和 K0 最早的{{1} }日期,但 K0 得到COL4 < 16
,因为订购 K2 和 K0 时, K0 排在最前面
COL2
请记住,这是一个INC=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中,查询有些棘手。