여러분 안녕하세요,
두 dt 가지고 있고 보조 dt 데이터를 기반으로 기본 dt에 새 열을 만들고 싶습니다.
"dt1"날짜 열의 날짜를 확인하고 시작일과 종료일을 기준으로 "dt2"의 그룹 번호와 일치하는 JSL 명령을 원합니다. (시간대)
dt1 : (주)
| 날짜 | 그룹 |
| 5/17/2019 13:06 | |
| 5/17/2019 13:06 | |
| 5/23/2019 10:02 | |
| 5/24/2019 13:47 | |
dt2 : (2 차)
| 그룹 | 시작일 | 종료일 |
| 1 | 5/17/2019 20:15 | 5/18/2019 8:14 |
| 2 | 5/18/2019 8:15 | 5/18/2019 20:14 |
| 1 | 5/18/2019 20:15 | 5/19/2019 8:14 |
| 삼 | 5/19/2019 8:15 | 5/19/2019 20:14 |
| 2 | 5/19/2019 20:15 | 5/20/2019 8:14 |
| 삼 | 5/20/2019 8:15 | 5/20/2019 20:14 |
| 2 | 5/20/2019 20:15 | 5/21/2019 8:14 |
| 4 | 5/21/2019 8:15 | 5/21/2019 20:14 |
| 삼 | 5/21/2019 20:15 | 5/22/2019 8:14 |
| 4 | 5/22/2019 8:15 | 5/22/2019 20:14 |
| 삼 | 5/22/2019 20:15 | 5/23/2019 8:14 |
| 1 | 5/23/2019 8:15 | 5/23/2019 20:14 |
| 4 | 5/23/2019 20:15 | 5/24/2019 8:14 |
| 1 | 5/24/2019 8:15 | 5/24/2019 20:14 |
귀하의 도움을 높이 평가 될 것입니다.
안녕하세요 @ileshem ,
이 문제를 해결할 수있는 몇 가지 방법이 있습니다. 한 가지 방법은 시작 날짜와 종료 날짜 사이의 모든 시간대에 대한 그룹을 나열하는 테이블을 만드는 것입니다. 그런 다음 테이블> 업데이트로 해당 테이블을 사용하여 그 새 날짜 열에서 직접 일치시켜 그룹 번호를 가져올 수 있습니다 시작과 끝. 그 새로운 스팬 테이블을 만드는 것이 포함되며, 얼마나 많은 날짜 범위에 따라 테이블이 상당히 커질 수 있습니다.
또 다른 옵션 (이 경우에 대한 환경 설정이 있음)은 테이블> JMP 쿼리 작성기를 사용하여 일부 SQL 로직을 사용하여 시작 날짜 이후의 날짜와 시작 날짜가 일치하는 조인을 설정할 수있게합니다 종료일. 대화식으로이 쿼리를 디자인 할 수 있는데, 이는 내가이 접근법을 좋아하는 이유 중 하나입니다. 따라서 스크립트를 사용하지 않으려는 경우 마우스로 모든 작업을 수행 할 수 있습니다. 스크립트를 저장하면 일반화하기가 너무 어렵지 않은 jsl이됩니다. 확장자가없는 테이블 이름 만 얻고 evalInsert ()를 사용하여 테이블 이름을 삽입하려면 약간의 트릭이 필요합니다. 조금 이상하고, 다른 사람들이 내가 여기 한 일을하는 더 우아한 방법을 가지고 있을지도 모릅니다. 즉, 일부 사용자 정의 JSL을 작성하지 않고 한 테이블에서 한 행씩 다른 테이블에서 룩업을 수행하는 방법 (세 번째이며 완전히 수용 가능한 접근법)입니다.
다음은 JMP Query Builder의 코드입니다. 이것을 시험해보기 위해 예제 테이블을 첨부했습니다. 대화 형으로 설정하는 방법에 관심이 있으시면 처음부터 다시 빌드하는 데 30 초가 걸립니다.
dt1 = Data Table( "primary.jmp" );
dt2 = Data Table( "secondary.jmp" );
dt1NameOnly = Left( dt1 << getname, Length( dt1 << getname ) - 4 );
dt2NameOnly = Left( dt2 << getname, Length( dt2 << getname ) - 4 );
New SQL Query(
Version( 130 ),
Connection( "JMP" ),
JMP Tables( Eval Insert( "\[ [dt1<<GETNAME> "_MEMORY_", dt2<<GETNAME> "_MEMORY_"] ]\" ) ),
QueryName( "SQLQuery1" ),
Select( Column( "date", "t1", Numeric Format( "m/d/y h:m", "-1", "NO", "" ) ), Column( "Group 2", "t2" ) ),
From(
Table( dt1NameOnly, Alias( "t1" ) ),
Table(
dt2NameOnly,
Alias( "t2" ),
Join(
Type( Left Outer ),
GE(
Column( "date", "t1", Numeric Format( "m/d/y h:m", "-1", "NO", "" ) ),
Column( "Start Date", "t2", Numeric Format( "m/d/y h:m", "-1", "NO", "" ) )
) & LE(
Column( "date", "t1", Numeric Format( "m/d/y h:m", "-1", "NO", "" ) ),
Column( "End Date", "t2", Numeric Format( "m/d/y h:m", "-1", "NO", "" ) )
)
)
)
)
) << Run;
</GETNAME></GETNAME>안녕 다시, @ileshem ,
나는 당신이 커스텀 jsl로 이것을 해결할 수 있다고 언급했고, 보조 테이블에서 조건에 맞는 날짜를 찾기 위해 주 테이블을 통해 행별로 행하는 몇 가지 For () 루프를 사용하여 한 가지 방법을 공유하고자했습니다. 매우 큰 응용 프로그램에서이 작업을보다 효율적으로 수행 할 수있는 방법이 있지만 시작에 불과합니다.
dt1 = Data Table( "primary.jmp" );
dt2 = Data Table( "secondary.jmp" );
For( i = 1, i <= N Row( dt1 ), i++,
For( j = 1, j <= N Row( dt2 ), j++,
If( And( dt1:date[i] >= dt2:Start Date[j], dt1:date[i] <= dt2:End Date[j] ),
dt1:Group[i] = dt2:Group[j];
Break();
)
)
);
@ 율리안