병합으로 수행 할 수 있습니다. 더미 테이블로 데이터를 시뮬레이션 : 당신이 의사의 행 번호와 함께, 각 행에 대한 별도의 컬럼으로 총을 얻기 위해 분석 기능을 사용할 수 있습니다
create table t42 (identifier varchar2(10), revenue number, good_inflow number);
insert into t42 values ('abc123', 20, 15);
insert into t42 values ('abc124', 10, 5);
insert into t42 values ('abc124', 5, 5);
:
select t42.*,
sum(revenue) over (partition by identifier, good_inflow) as total_revenue,
row_number() over (partition by identifier, good_inflow order by rowid) as rn,
count(*) over (partition by identifier, good_inflow) as cnt
from t42;
IDENTIFIER REVENUE GOOD_INFLOW TOTAL_REVENUE RN CNT
---------- ------- ----------- ------------- ---- ----
abc123 20 15 20 1 1
abc124 10 5 15 1 2
abc124 5 5 15 2 2
그런 다음 수 이 경우 문을 merge
문으로 사용하고 기본 테이블의 rowid
을 on
조건으로 추가하고 생성 된 cnt
을 사용하여 중복 된 테이블 만 업데이트합니다 (따라서 한 번만 나타나는 ID/유입 쌍은 무의미하지 않습니다). 동일한 가치로 업데이트 됨 e) :
merge into (select t42.*, rowid from t42) t42
using (
select t42.*, rowid,
sum(revenue) over (partition by identifier, good_inflow) as total_revenue,
row_number() over (partition by identifier, good_inflow order by rowid) as rn,
count(*) over (partition by identifier, good_inflow) as cnt
from t42
) tmp
on (tmp.rowid = t42.rowid and tmp.cnt > 1)
when matched then
update set revenue = case when tmp.rn = 1 then tmp.total_revenue else null end
delete where (revenue is null);
2 rows merged.
delete
절은 업데이트 후 값에서 작동합니다. 각 조합에 대해 공칭 첫 행을 제외한 모든 경우에 대해 수익을 null로 설정하는 사례 식을 사용했습니다. null이 삭제 될 수 있습니다.
select * from t42;
IDENTIFIER REVENUE GOOD_INFLOW
---------- ------- -----------
abc123 20 15
abc124 15 5
그러나 수익 값은 null 일 수 있습니다. nullable 인 경우이를 처리 할 수 있습니다.
표 데이터를 이미지가 아닌 형식이 지정된 텍스트로 표시하십시오. 그것들은 당신의 탁자에있는 유일한 세 개의 기둥입니까? 해당 특정 행 쌍 (특정 값을 사용하여 간단한 업데이트 및 삭제로 수행 할 수 있음)을 결합하거나 결합해야하는 유사한 쌍이 많이 있습니까? –
SELECT 쿼리 또는 delete 문으로 사용 하시겠습니까? – kbball
@AlexPoole - 질문이 실제로 필요한 경우 (보고서의 데이터를 그룹화하는 것이 아니라 테이블의 데이터를 변경하는 것) - 이것이 좋은 습관입니까? 내 의견으로는, 대부분의 경우 그것은 빈약 한 실천이다. 분석 및보고 목적으로보기 (성능을 위해 필요한 경우 MV)를 작성할 수 있지만 기본 데이터는 그대로 두어야합니다. – mathguy