안녕하세요. 일부 데이터를 정리하는 데 도움이 필요합니다. 테이블의 데이터에는 여러 ID, 날짜, 카테고리가 포함되어 있습니다. 카테고리 1과 2, 1과 2와 3, 1과 3의 ID에 관심이 있으며, 각 카테고리의 최대 날짜가 있는 항목만 유지합니다. 이 솔루션에 가장 적합한 스크립트를 제공해 주시겠습니까? 감사합니다!
| ID | 범주 | 날짜 | 비용A | 비용B | 비용C | 비용D |
| 1 | 1 | 16/1/21 | 5000 | 0 | 3000 | 500 |
| 1 | 1 | 16/1/21 | 1000 | 5000 | 10000 | 0 |
| 1 | 1 | 16/1/21 | 20000 | 0 | 10 | 50 |
| 1 | 2 | 16/1/22 | 3000 | 0 | 0 | 50000 |
| 1 | 3 | 2016년 2월 1일 | 1 | 10 | 900 | 0 |
| 2 | 1 | 13/4/2 | 0 | 100 | 10000 | 5000 |
| 2 | 2 | 13/4/3 | 0 | 0 | 0 | 642.49 |
| 2 | 1 | 13/4/2 | 1 | 10 | 900 | 0 |
| 3 | 2 | 15/3/6 | 50 | 0 | 0 | 259.58 |
다음은 작동해야 하는 작은 스크립트입니다. 정의를 충족하는 행을 찾습니다. 그런 다음 해당 행은 새 테이블에 하위 집합으로 포함됩니다.
Names Default To Here( 1 );
dt = Current Data Table();
For Each Row(
If( :date == Col Maximum( :date, :ID ),
currID = :ID;
//currID="1"
cats = Associative Array( dt:category[dt << get rows where( :ID == currID )] ) << get keys;
If( cats[1] == "1" & Length( cats ) > 1,
dt << select rows( Row() )
);
)
);
dtNew = dt << subset( selected columns(0), selected rows(1),
output table("Final")
);
// The above code will allow multiple rows within a given ID, when there are
// multiple rows with the same maximum date. Run the below code to
// get rid of the multiple entries, if that is what is desired
dtNew << select duplicate rows(Match(:ID));
dtNew << delete rows;


위 스크립트의 마지막 2줄을 실행하면 중복된 ID 행이 삭제됩니다.

짐,
도움을 주셔서 감사합니다. 혼란을 드려 죄송합니다. 최종 테이블에 카테고리 1, 2 및/또는 3이 있어야 하는 각 ID가 필요합니다. 동일한 카테고리에 반복되는 ID가 있는 경우 최대 날짜가 있는 행이 필요합니다. 여기에 테이블이 제공되어야 합니다. 미리 도움을 주셔서 감사합니다.
| ID | 범주 | 날짜 | 비용A | 비용B | 비용C | 비용D |
| 1 | 1 | 16/1/21 | 20000 | 0 | 10 | 50 |
| 1 | 2 | 16/1/22 | 3000 | 0 | 0 | 50000 |
| 2 | 1 | 13/4/2 | 0 | 100 | 10000 | 5000 |
| 2 | 2 | 13/4/3 | 0 | 0 | 0 | 642.49 |
| 3 | 1 | 15/3/6 | 3000 | 0 | 0 | 817 |
| 3 | 2 | 15/3/6 | 50 | 0 | 0 | 259.58 |
| 4 | 1 | 15/3/6 | 10000 | 0 | 0 | 710.16 |
| 4 | 2 | 15/3/6 | 5000 | 0 | 0 | 1087 |
| 4 | 3 | 15/3/16 | 0 | 0 | 0 | 326.7 |
위의 예에는 Category가 문자 열로 포함되어 있습니다. 귀하의 예는 숫자입니다. 또한 최소한 카테고리 1&2, 1&3 또는 1&2&3이 있도록 논리를 변경했습니다.
Names Default To Here( 1 );
dt = Current Data Table();
For Each Row(
If( :date == Col Maximum( :date, :ID ),
currID = :ID;
cats = Associative Array( dt:category[dt << get rows where( :ID == currID )] ) << get keys;
show(cats);
If( Length( cats ) > 1,
If( cats[1] == 1 & (cats[2] == 2 | cats[2] == 3),
dt << select rows( Row() )
)
);
)
);
dtNew = dt << subset( selected columns( 0 ), selected rows( 1 ), output table( "Final" ) );
Col 함수를 사용하여 이에 접근할 수 있는 한 가지 방법은 다음과 같습니다.
Names Default To Here(1);
dt = New Table("Untitled 3",
Add Rows(11),
Compress File When Saved(1),
New Column("ID", Numeric, "Continuous", Format("Best", 12), Set Values([1, 1, 1, 2, 3, 3, 4, 4, 4, 4, 4])),
New Column("Category", Character, "Nominal", Set Values({"A", "A", "B", "A", "A", "C", "A", "A", "B", "B", "C"})),
New Column("Date", Numeric, "Continuous", Format("Best", 12), Set Values([1, 1, 2, 1, 1, 2, 1, 2, 1, 2, 1]))
);
dt << New Column("KEEP", Numeric, Nominal, Formula(
Col Sum(Row() == Col Min(Row(), :category, :id), :id) > 1 & :date == Col Max(:date, :category, :id)
));
수식을 <<선택 위치 / <<행 가져오기 위치로 변경하거나 subset과 함께 사용하여 유지하려는 행을 가져옵니다.

편집하다:
원래 버전에서는 범주 1이 누락될 수 있다는 점을 고려하지 않았습니다(이것은 범주가 숫자 열이라고 가정합니다)
New Column("KEEP", Numeric, Nominal, Formula(
Col Sum(Row() == Col Min(Row(), :category, :id), :id) > 1
& :date == Col Max(:date, :category, :id)
& Col Sum(If(:category == 1, 1, .), :id)
));