> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 통계로 더 많은 작업 수행

> 버전 관리, 메타데이터, 트랜잭션 쓰기, 진행 추적을 확장하는 통합 등 고급 PlayFab Statistics 기능을 살펴봅니다

이 튜토리얼에서는 다중 열 통계 만들기 및 통계 쿼리 방법과 같이 서비스가 제공하는 더 고급 기능을 다룹니다. 이러한 기능을 통해 통계 서비스가 수행할 수 있는 한계를 넘어서고자 합니다.

이러한 새 기능이 우리가 몇 가지 문제를 해결하는 데 어떻게 도움이 될 수 있는지 보여주는 예로 매우 경쟁적인 슈터를 사용합니다. 이 게임에는 플레이어가 장거리 슛을 맞출 수 있는 여러 무기가 있습니다. 우리는 장거리 슛의 거리뿐만 아니라 사용된 총알의 구경도 추적하려고 합니다.

## 사전 요구 사항

[기본 통계 만들기](/services/playfab/player-progression/statistics/create-basic-statistics)의 단계를 완료합니다.

## 다중 열 통계 정의 만들기

이 예제를 시작하려면 이전보다 더 복잡한 통계 정의를 만들어야 합니다.

우리는 여러 열을 정의하여 장거리 슛의 주요 측면인 거리와 구경을 매핑합니다.
다음 예제는 C# SDK를 사용하여 통계 정의를 만드는 방법을 보여줍니다.

```C# theme={null}
public static async Task CreateStatisticDefinitionAsync(PlayFabAuthenticationContext context, string statName)
{
    PlayFabProgressionInstanceAPI statsAPI = new PlayFabProgressionInstanceAPI(context);
    CreateStatisticDefinitionRequest statDefinitionRequest = new CreateStatisticDefinitionRequest()
    {
        Name = statName,
        AuthenticationContext = context,
        EntityType = "title_player_account",
        VersionConfiguration = new VersionConfiguration()
        {
            MaxQueryableVersions = 1,
            ResetInterval = ResetInterval.Manual,
        },
        Columns = new List<StatisticColumn>()
        {
            new StatisticColumn()
            {
                Name = "Distance",
                AggregationMethod = StatisticAggregationMethod.Max,
            },
             new StatisticColumn()
            {
                Name = "Caliber",
                AggregationMethod = StatisticAggregationMethod.Min,
            }
        },
    };
    
    PlayFabResult<PlayFab.LeaderboardsModels.EmptyResponse> createStatDefResult = await statsAPI.CreateStatisticDefinitionAsync(statDefinitionRequest);
}
```

여기서 가장 중요한 구성 요소는 `Columns` 매개 변수인데, 이는 여러 값의 `StatisticColumn` 정의를 허용하므로
통계가 여러 값을 가질 수 있게 합니다. 유일한 예외는 `Sum` 집계를 사용할 때입니다. 또한 허용되는 최대 열 수는 5개입니다.

## 통계에 데이터 추가

이제 통계를 만들었으므로 데이터를 추가할 것입니다. 이 주제에 대한 이전 튜토리얼과의 주요 차이점은
이제 두 개의 서로 다른 값을 추가해야 한다는 것입니다. 다음 예제는 C# SDK를 사용하여 통계에 데이터를 추가하는 방법을 보여줍니다.

```C# theme={null}
public static async Task UpdateStatisticForPlayer(PlayFabAuthenticationContext context, string statName, string entityId, int score)
{
    PlayFabProgressionInstanceAPI statsAPI = new PlayFabProgressionInstanceAPI(context);
    UpdateStatisticsRequest updateStatRequest = new UpdateStatisticsRequest()
    {
        Entity = new PlayFab.LeaderboardsModels.EntityKey()
        {
            Id = entityId,
            Type = EntityType
        },
        AuthenticationContext = context,
        Statistics = new List<PlayFab.LeaderboardsModels.StatisticUpdate>() 
        {
            new PlayFab.LeaderboardsModels.StatisticUpdate() 
            {
                Name = statName,
                Scores = new List<string> { score.ToString(), score.ToString()},
            }
        }
    };

    PlayFabResult<UpdateStatisticsResponse> updateResult = await statsAPI.UpdateStatisticsAsync(updateStatRequest);
}
```

여기서 핵심 요점은 추가할 통계 내의 `Scores` 매개 변수에 있습니다. 코드 예제에서
두 개의 서로 다른 값을 볼 수 있는데, 모두 문자열이지만 이는 단지 통계 내의 입력 정의일 뿐입니다. 이러한 값은
숫자로 처리됩니다. 점수 목록의 길이는 통계 정의의 열 수와 항상 일치해야 합니다.

## 통계에서 데이터 검색

이제 여러 엔터티를 쿼리하고 각각과 관련된 모든 통계를 얻는 방법을 배웁니다.
다음 예제는 C# SDK를 사용하여 통계에 데이터를 추가하는 방법을 보여줍니다.

```C# theme={null}
public static async Task GetStatsForEntities(PlayFabAuthenticationContext context, string[] entityIds)
{
    PlayFabProgressionInstanceAPI statsAPI = new PlayFabProgressionInstanceAPI(context);

    GetStatisticsForEntitiesRequest request = new GetStatisticsForEntitiesRequest()
    {
        AuthenticationContext = context,
        Entities = entityIds.Select(entity => new PlayFab.LeaderboardsModels.EntityKey()
        {
            Id = entity,
            Type = EntityType
        }).ToList(),
    };

    PlayFabResult<GetStatisticsForEntitiesResponse> result = await statsAPI.GetStatisticsForEntitiesAsync(request);

    foreach (EntityStatistics entityStatistics in result.Result.EntitiesStatistics)
    {
        Console.WriteLine("Stats for entity: " + entityStatistics.EntityKey.ToString());
        foreach (var stat in entityStatistics.Statistics)
        {
            Console.WriteLine($"{stat.Name} : {string.Join('|', stat.Scores)}");
        }
    }

}
```

### 동점 해결

다중 열 통계 정의가 있을 때 동점 해결이 필요한 시나리오를 만날 수 있습니다. 이 메커니즘의 작동 방식은 열이 추가된 순서를 따르는 것입니다. 새 값이 들어올 때마다 시스템은 첫 번째 열의 집계 기준을 충족하는지 확인합니다. 값이 동일한 경우 두 번째 열의 기준을 확인하러 갑니다. 이 동작은 다음 열에 대해 계속됩니다.

예를 들어, 다음과 같이 세 개의 열이 있는 통계를 가질 수 있습니다.

* 첫 번째 열은 Min 집계를 가집니다.
* 두 번째 열은 Max 집계를 가집니다.
* 세 번째 열은 Last 집계를 가집니다.

새 값이 들어오면 첫 번째 열보다 낮아야 합니다. 그런 다음 두 번째 열보다 커야 합니다.
마지막으로 세 번째 열은 Last 집계로 설정되어 있으므로 처음 두 검증을 충족하면 항상 업데이트됩니다.

## 결론

이 튜토리얼에서는 다음 작업을 수행하는 방법을 배웠습니다.

* 다중 열 통계 만들기
* 통계 쿼리
* 동점 해결 작동 방식 이해.

## 참고 항목

* [통계에 컨텍스트 데이터 추가](/services/playfab/player-progression/statistics/metadata-statistics)..
* [기본 통계 만들기](/services/playfab/player-progression/statistics/create-basic-statistics).
* [시즌별 통계](/services/playfab/player-progression/statistics/seasonal-statistics).
* [트랜잭션 쓰기](/services/playfab/player-progression/statistics/transactional-writes)
* [API 참조](/services/playfab/player-progression/statistics/api-reference).
* [제한](/services/playfab/player-progression/statistics/limits-statistics).
* [할당량](/services/playfab/player-progression/statistics/quota-statistics)


## Related topics

- [API 통계 참조](/ko/services/playfab/player-progression/statistics/api-reference.md)
- [통계 제한 사항](/ko/services/playfab/player-progression/statistics/limits-statistics.md)
- [기본 통계 만들기](/ko/services/playfab/player-progression/statistics/create-basic-statistics.md)
- [메타데이터 통계](/ko/services/playfab/player-progression/statistics/metadata-statistics.md)
- [커뮤니티 통계](/ko/services/playfab/player-progression/statistics/community-statistics.md)
