중복된 값을 어떻게 확인하나요?안녕하세요 여러분,
저는 이 코드 조각을 가지고 있지만 이것에 더 적절한 접근 방식이 있는지 잘 모르겠습니다. 제 루프는 일부 데이터 테이블에 여러 개의 NBO 값이 있기 때문에 오류가 발생합니다.
'For Each'에 대한 접근 또는 평가 중 행 10에서 데이터가 범위를 벗어났습니다. For Each/*###*/({table}, dt_Test, table << New Column( "Ref" ) ; Wait( 0 ) ; table
:Ref[table << :Lot == "NBO" & :N Rows == Col Max( :N Rows, :Lot ) ) 행 가져오기]
= 1)
그래서 제가 하려는 것은 For Each 루프 안에 If 문을 만드는 것입니다. IF 문은 NBO에 Lot 열에 중복이 없는지 확인하고, 중복이 없으면 Ref 열에 1을 넣습니다.
For Each( {table}, dt_Test,
table << New Column("Ref");
wait(0);
If (
//NBO has duplicate, deletes the NBO with lowest N Row value
dt_Test << Select duplicate rows(Match(:Lot)); //only selects the matching values, how can I delete the NBO with lowest N Rows count?
dt_Test << Delete Rows;
,
//if NBO has no duplicates,
table:Ref[table << get rows where( :Lot == "NBO" & :N Rows == col max(:N Rows, :Lot))]=1;
);
);
자동화 및 스크립팅윈도우Re: 중복된 값을 확인하고 가장 낮은 N개 행 값을 갖는 데이터를 삭제하는 방법은 무엇입니까?일부 데이터를 볼 수 있다면 훨씬 더 쉬울 것 같아요.
Re: 중복된 값을 확인하고 가장 낮은 N개 행 값을 갖는 데이터를 삭제하는 방법은 무엇입니까?다음은 부분 집합 이후의 샘플 데이터 테이블입니다. dt에는 2개의 NBO가 있으며 잘 작동합니다.
table:Ref[table << get rows where( :Lot == "NBO" & :N Rows == col max(:N Rows, :Lot))]=1;
하지만 내가 1 NBO를 가지고 있는 dt2에서는 스크립트가 갑자기 멈추고 다음과 같은 오류가 발생합니다.
'For Each'에 대한 접근 또는 평가 중 행 10에서 데이터가 범위를 벗어났습니다. For Each/*###*/({table}, dt_Test, table << New Column( "Ref" ) ; Wait( 0 ) ; table
:Ref[table << :Lot == "NBO" & :N Rows == Col Max( :N Rows, :Lot ) ) 행 가져오기]
= 1)
Re: 중복된 값을 확인하고 가장 낮은 N개 행 값을 갖는 데이터를 삭제하는 방법은 무엇입니까?스크립트와 하려는 일이 좀 헷갈립니다. 중복된 lot을 찾아서 마지막 행을 제외한 모든 행을 삭제하려는 건가요? 그리고 NBO를 1로 설정하려는 건가요(하나만 남아야 함)?
Re: 중복된 값을 확인하고 가장 낮은 N개 행 값을 갖는 데이터를 삭제하는 방법은 무엇입니까?죄송합니다. 저도 질문을 쓰는 데 헷갈렸습니다. 그래서 데이터의 경우, 먼저 하위 집합을 만든 다음 각 데이터 테이블을 살펴보고 열 Ref와 그 값을 1로 추가합니다. 여기서 NBO는 N개 행에서 가장 높은 카운트를 가집니다. 처음에는 이렇게 작동했습니다.
For Each( {table}, dt_Test,
table << New Column("Ref");
wait(0);
table:Ref[table << get rows where( :Lot == "NBO" & :N Rows == col max(:N Rows, :Lot))]=1;
);하지만 열에 NBO가 1개만 있는 데이터 테이블로 루프를 돌았을 때 다음과 같은 오류가 발생했습니다.
'For Each'에 대한 접근 또는 평가 중 행 10에서 데이터가 범위를 벗어났습니다. For Each/*###*/({table}, dt_Test, table << New Column( "Ref" ) ; Wait( 0 ) ; table
:Ref[table << :Lot == "NBO" & :N Rows == Col Max( :N Rows, :Lot ) ) 행 가져오기]
= 1)
Re: 중복된 값을 확인하고 가장 낮은 N개 행 값을 갖는 데이터를 삭제하는 방법은 무엇입니까?아마 문제가 다른 곳에 있는 것일 수도 있겠네요. 예를 들어 dt_test에는 무엇이 들어 있을까요? 그리고 dt_test와 table은 약간 이상한 방식으로 사용됩니다(또한 if가 여기서 여러분이 생각하는 대로 작동하지 않을 수도 있습니다)

디버깅을 더 쉽게 하기 위해 코드를 조금 수정하겠습니다([] 내부에 get 행을 배치하지 마세요)
Names Default To Here(1);
dt = Open("$DOWNLOADS/dt.jmp");
dt2 = Open("$DOWNLOADS/dt2.jmp");
dts = Eval List({dt, dt2});
For Each({cur_dt}, dts,
cur_dt << New Column("Ref");
//cur_dt = dts[2];
sel_rows = cur_dt << get rows where(:Lot == "NBO" & :N Rows == Col Max(:N Rows, :Lot));
cur_dt:Ref[sel_rows] = 1;
);
이 방법을 사용하면 sel_rows를 인쇄하여 비어 있는지, 무엇이 있는지 확인할 수 있습니다.
Re: 중복된 값을 어떻게 결정하나요?완전히 다른 접근 방식을 제안할 수도 있습니다.
1. 날짜별로, 또는 가장 최신 중복 항목을 알려주는 기준으로 표를 정렬합니다.
2. 테이블을 자체적으로 조인(테이블>조인)하고 다중 항목 삭제 옵션을 클릭합니다.
- 중복된 항목 중 행 순서에 따라 첫 번째 항목만 제품 테이블에 표시됩니다.
워크플로 빌더를 켜고 이 작업을 한 번 수동으로 수행하면 굉장한 스크립트가 생겨서 다시 수행할 수 있습니다. 스크립팅... 스크립팅 없이 수행하세요.
Re: 중복된 값을 어떻게 결정하나요?좋은 트릭이네요:)