여기에 JSL이 필요로하는 모든 프로그래밍 문제가 있습니다.
다음과 같은 테이블에 4 레벨의 계층 데이터가 있습니다.

다음과 같은 트리 상자를 사용 하여이 데이터에서 계층 적 트리 구조를 만들고 있습니다.

내 코드는 약 40 초 안에이 출력을 만듭니다. 더 빠른 방법이 있습니까? 다양한 접근 방식을 시도했지만 하위 집합을 만드는 것이 가장 빠른 것 같습니다. 내 코드는 다음과 같습니다.
dt = data table ("AE Levels");
ae_tree = {};
e0 = hp time();
// Get unique level 1 values
summarize(dt, level1_list = by(:Level 1));
for (i = 1, i <= nitems(level1_list), i++,
caption("Processing Level1 " || char(i));
wait(0);
level1_rows = dt << get rows where(:Level 1 == level1_list[i]);
// Create a tree node for this level
level1_node = tree node("Level 1: " || level1_list[i]);
// Make a subset of this level1's values
dt1 = dt << subset(private, rows(level1_rows));
// Get unique level 2 values for this value of level 1
summarize(dt1, level2_list = by(:Level 2));
for (k = 1, k <= nitems(level2_list), k++,
// Create a tree node for this level
level2_node = tree node("Level 2: " || level2_list[k]);
level2_rows = dt << get rows where(:Level 2 == level2_list[k]);
dt2 = dt << subset(private, rows(level2_rows));
// Get unique level 3 values for this value of level 2
summarize(dt2, level3_list = by(:Level 3));
for (m = 1, m <= nitems(level3_list), m++,
// Create a tree node for this level
level3_node = tree node("Level 3: " || level3_list[m]);
l3_rows = dt << get rows where(:Level 3 == level3_list[m]);
dt3 = dt << subset(private, rows(l3_rows));
// Get unique level 4 values for this value of level 3
summarize(dt3, l4_list = by(:Level 4));
close(dt3, nosave);
for (n = 1, n <= nitems(l4_list), n++,
// Create a tree node for this level
l4_node = tree node("Level 4: " || l4_list[n]);
// Add the level 4 node to the level 3 node
level3_node << append(l4_node);
);
// Add the level 3 node to the level 2 node
level2_node << append(level3_node);
);
close(dt2, nosave);
// Add the level 2 node to the level 1 node
level1_node << append(level2_node);
);
close(dt1, nosave);
insertinto(ae_tree, level1_node);
);
caption(remove);
wait(0);
e1 = hp time();
show((e1 - e0) / 1000000);
nw = new window("AE Tree",
mtree = tree box(ae_tree, Size( 1000, 500 ),
<< Set Max Size( 2000, 4000 ),
<< Set AutoStretching( 1, 1 )
)
);
나는 그렇게 생각합니다 ... 충분히 오래 보지 않았을 수도 있지만 이것이 의미가 있다면 약 10 배 빠릅니다 ... 이것은 가장 안쪽 루프입니다 ... 외부 루프도 필요합니다. LinkToOriginalDataTable은 전혀 도움이되지 않는 것처럼 보였지만 놀랍지 만 더 작은 하위 집합을 사용하여 추가 하위 설정을 사용하면 많은 도움이되었습니다.
l3_rows = dt2 << 행 가져 오기 where (: Level 3 == level3_list [m]);
dt3 = dt2 << 하위 집합 (개인, 행 (l3_rows), LinkToOriginalDataTable (1) );
// 레벨 3의이 값에 대해 고유 한 레벨 4 값을 얻습니다.
요약 (dt3, l4_list = by (: Level 4));
(e1-e0) / 1000000 = 3.226879;
감사합니다 Craige-귀하의 솔루션은 "왜 그렇게 생각하지 않았습니까?"라는 범주에 속합니다. 너무 말이 되네요!