안녕하세요 JSL 전문가 여러분,
한 열에서 두 번째 최대값, 세 번째 최대값 등 값을 찾는 데 큰 문제가 있습니다.
아래 열의 경우 상위 5개 최대 값을 식별하고 별도의 열에 값을 표시하기를 바랍니다.
col max만 구할 수 있는 것 같은데 2nd max, 3rd max 등을 찾는 데 어려움이 많다.
이 솔루션에 대한 표준 공식이 있습니까?
감사
(100,
232,
343,
121,
100,
132,
100,
100,
100,
100,)
안녕하세요,
이것은 "최대"가 의미하는 것과 테이블을 정렬할 의향이 있는지 여부에 따라 다릅니다. 나는 몇 가지 일반적인 경우를 다룰 것이며 그 중 하나가 귀하의 사용 사례를 다루기를 바랍니다.
사례 1: "최대"는 중복을 포함하여 원래 값의 정렬된 데이터 세트에서 위치를 의미합니다.
이를 위해 내장 변환을 사용할 수 있습니다. 관심 있는 열의 데이터를 마우스 오른쪽 버튼으로 클릭하고 새 공식 열 > 분포 > 순위(역순)를 선택합니다.
생성된 수식을 클릭하면 테이블 정렬 여부에 관계없이 작동하는 다음이 표시됩니다.
(Col Number( :Col1 ) - Col Rank( :Col1 )) + 1

사례 2: "최대"는 정렬된 UNIQUE 값 집합의 위치를 의미합니다(중복 없음). 데이터 사전 정렬을 원하지 않습니다.
***참고: 연관 배열에 의존하기 때문에 이 접근 방식은 소수점 이하 자릿수가 최대 하나인 숫자 데이터에서만 작동합니다.
복잡하고 비싼 공식을 사용할 수 있습니다.
Loc(
Matrix(
Reverse(
Associative Array( (:Col1 << get data table) :: col1 << getvalues ) << get keys
)
),
:Col1
)
이 수식은 다음을 수행합니다.
1) 관심 있는 열에서 값을 가져와 중복을 제거하는 연관 배열로 전달합니다.
2) 연관 배열 키를 가져오고(기본적으로 낮은 순서에서 높은 순서로) 순서를 반대로 합니다.
3) Loc() 함수를 사용하여 역 연관 배열 키의 행렬 내에서 주어진 행의 위치를 보고합니다.
사례 3: 사례 2와 같지만 관심 열을 기준으로 사전 정렬(내림차순)할 수 있습니다.
이 경우 자체 참조 공식이지만 더 간단하고 효율적으로 사용할 수 있습니다.
If( Row() == 1,
1,
Lag( :Formula3 ) + (Lag( :Col1 ) != :Col1)
)
아래에서 첫 번째 공식과 다음 두 공식의 차이점을 볼 수 있습니다. 다시 말하지만, 세 번째 공식만 테이블 정렬에 의존합니다.

이것을 시도하고 싶다면 아래 스크립트를 실행하십시오. 처음에는 정렬되지 않은 것처럼 보이지만 1초 동안 일시 중지한 후 col1을 기준으로 정렬합니다. 이때 세 번째 공식의 결과는 두 번째 공식의 결과와 일치합니다.
dt = New Table( "Example",
Add Rows( 20 ),
New Column( "Col1", <<SET values=""></SET>
건배,
브래디