Re: 두 개의 데이터 테이블에서 타임스탬프를 일치시켜 행에 정보를 추가하는 가장 효율적인 방법입니다.이를 수행할 수 있는 몇 가지 옵션이 있습니다(특히 스크립팅의 경우).범위 및 행 조인 방법을 정의할 수 있는 테이블 메뉴(데이터 테이블과 함께 사용할 수 있음)에서 JMP 쿼리 빌더를 사용하여 SQL 쿼리를 작성할 수 있습니다.
Re: 두 데이터 테이블의 타임스탬프를 일치시켜 행에 정보를 추가하는 가장 효율적인 방법은 무엇입니까?여기 내 접근 방식이 있습니다.데이터를 정렬하면 한 번에 통과할 수 있고 필요한 값을 찾을 수 있습니다.일반적인 접근 방식에 대해서는 아래의 JSL을 살펴보십시오.코드가 테스트되지 않았으므로 테스트할 데이터 테이블이 없습니다.그러나 이전에 이 방법을 여러 번 사용했으며 효율적인 방법입니다.그러나 약간 조정할 준비를하십시오.
Names Default To Here( 1 );
dt = Current Data Table();
nr = N Rows( dt );
dtPDTag = Data Table( "2205 - 2209 PD3102" );
nrPD = N Rows( dtPDTag );
// Sort both data tables by the timestamps to allow the tables to only
// have to be read once
// Before sorting the data, if the tables need to be returned to the
// original order then create a new column in each table that represents
// the current Row number, which then will allow the table to be sorted
// back to the original order
// dt << New Column( "_row_", set each value( Row() ));
// dtPDTag << New Column( "_row_", set each value( Row() ));
dt << sort( By( :StartTime, :EndTime ), order( ascending, ascending ), replace table( 1 ) );
dtPDTag << sort( By( :DateTime ), order( ascending ), replace table( 1 ) );
PDStart = 1; // Variable that keeps track of where in the dtPDTag table to start to find values
For( dtI = 1, dtI <= nr, dtI++,
For( dtPDI = PDStart, dtPDI <= nrPD, dtPDI++,
If( ( dtPDTag:DateTime[dtPDI] > dt:StartTime[dtI] ) & ( dtPDTag:DateTime[dtPDI] < dt:EndTime ),
dtPDTag:PO[dtPDI] = dt:PO[dtI];
dtPDTag:Symbol[dtPDI] = dt:Symbol[dtI];
PDStart = dtPDI;
Break();
)
);
// Resort to original if required and delete the _row_ column
// dt << sort( By( _row_ ), order( ascending ), replace table( 1 ) );
// dt << delete columns( :_row_ );
// dtPDTag << sort( By( _row_ ), order( ascending ), replace table( 1 ) );
// dtPDTag << delete columns( :_row_ );
Re: 두 데이터 테이블의 타임스탬프를 일치시켜 행에 정보를 추가하는 가장 효율적인 방법은 무엇입니까?고마워 짐. 해석과 그다지 효율적이지 않은 코드를 확인하려면 다음을 수행하십시오.
- 이미 응답된 행을 여러 번 거치지 않도록 PDStart를 카운터로 도입합니다.
- Break()를 포함합니다. 가능한 한 빨리 루프를 떠나려면
요컨대, 이 두 가지 추가로 내 코드에 내재된 중복성을 제거합니까?
Re: 두 데이터 테이블의 타임스탬프를 일치시켜 행에 정보를 추가하는 가장 효율적인 방법은 무엇입니까?옳은!
Re: 두 데이터 테이블의 타임스탬프를 일치시켜 행에 정보를 추가하는 가장 효율적인 방법은 무엇입니까?안녕,
나는 이것에 늦었다는 것을 깨닫습니다. 세미에서 일할 때 비슷한 요구가 있었고 데이터 테이블이 너무 커서 휴식이 있는 단일 루프도 작동하지 않았기 때문에 응답하기로 결정했습니다. 테이블이 그렇게 큰 경우 다음이 적합한지 확인하십시오. 내가해야 할 일입니다. 일반적인 경우 단일 프로세스 단계에서 타임스탬프가 많으면 시간이 많이 절약됩니다. 여기에는 두 가지 이유가 있습니다. 첫째, 비교가 없습니다. 둘째, 각 프로세스 단계에 대해 한 번만 반복하여 테이블 행을 대량의 값으로 설정합니다. 레시피 타임스탬프 데이터를 원래 테이블에 직접 연결하고 둘을 함께 작업한 다음 레시피 데이터를 제거하여 이를 수행합니다.
Names Default To Here( 1 );
//sample data table
dt1 = As Table( (1 :: 30)` || J( 30, 1, Random Uniform() ), <<COLUMN names=""></COLUMN>
당신이 이것을 보게되면 어떻게되는지 알려주십시오.
건배,
브래디
Re: 두 데이터 테이블의 타임스탬프를 일치시켜 행에 정보를 추가하는 가장 효율적인 방법은 무엇입니까?안녕하세요 Brady, 코드에 감사드립니다.
코드는 작업을 완전히 수행하기 위해 한 부분을 놓치고 있습니다. 실행 시작부터 올바른 PO 번호와 레서피 ID를 할당하지만 PO가 끝나도 멈추지 않습니다. 즉, 레서피 ID와 PO는 다음 PO가 시작될 때까지 계속 행에 배치됩니다. 일종의 "오버런".
내 데이터 테이블에는 수천 개의 행이 있지만 한 PO의 시작부터 다음 PO까지 10개의 기간이 있지만 첫 번째 PO는 기간 1에서 7까지 갔다고 가정하면 기간 8과 9는 " empty" 이므로 당시 생산이 없었기 때문에 삭제하고 다음 PO로 기간 10부터 계속합니다.
설명이 이해되기를 바랍니다.
두 데이터 테이블의 타임스탬프를 일치시켜 행에 정보를 추가하는 가장 효율적인 방법은?긴 시간 동안 5초 간격으로 Historian 데이터를 추출하여 많은 행의 데이터 테이블을 만들었습니다. 처음에 이 데이터 테이블에는 두 개의 열이 있었습니다(이 테이블을 "2205 - 2209 PD3102"라고 하고 dtPDTag로 참조함).
1. 날짜/시간 스탬프
2. 데이터 값(히스토리안 태그용)
다른 데이터 테이블(아래 JSL 구문의 dt)에는 PO 식별자와 레시피 기호가 있는 제작의 시작 및 종료 시간이 있습니다. (따라서 네 개의 열: 1. 시작 날짜/시간, 2. 종료 날짜/시간, 3. PO 번호, 4. 레시피 기호.)
dtPDTag에서 PO 번호와 레시피 기호(날짜/시간 스탬프 기준)를 추가하려는 두 개의 열(PO 및 기호)을 추가했습니다.이 작업을 수행하는 데 사용한 JSL 코드는 아래에 있지만 이 작업을 관리하는 데 매우 비효율적인 방법이라고 가정합니다.(내 컴퓨터는 요구 사항에 너무 건전하게 응답하지 않는 것 같습니다!) 앞으로 그러한 작업에 접근할 수 있는 더 나은/더 효과적인 방법을 듣는 것이 좋을 것입니다.
"가장 효율적인"이란 아래 JSL에서 볼 수 있는 두 개의 for 루프와 하나의 "if" 조건의 조합보다 더 효과적인 스크립팅 방법을 말합니다.
Names Default To Here(1);
dt = Current Data Table();
nr = N Rows(dt); // show(nr);
lstPO = dt:PO << Get Values;
lstSymbol = dt:Symbol << Get Values;
lstStartTime = dt:StartTime << Get Values;
lstEndTime = dt:EndTime << Get Values; // show(lstPO,lstSymbol,lstStartTime,lstEndTime);
dtPDTag = data Table( "2205 - 2209 PD3102" );
nrPD = N Rows(dtPDTag); // show(nrPD);
For(j=1,j<=nr,j++,
_start = lstStartTime[j]; _end = lstEndTime[j]; // show(_start,_end);
_PO =lstPO[j]; _symbol = lstSymbol[j];
For(i=1,i<=nrPD,i++,
If( ( dtPDTag:DateTime[i] > lstStartTime[j] ) & ( dtPDTag:DateTime[i] < lstEndTime[j] ),
dtPDTag:PO[i] = lstPO[j];
dtPDTag:Symbol[i] = lstSymbol[j];
,
);
);
);
자동화 및 스크립팅대량 맞춤화