> ## 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 統計資料功能，包括版本控制、中繼資料、交易式寫入，以及可擴充進度追蹤的整合

在本教學課程中，我們將介紹服務所提供的更多進階功能，例如建立多資料行統計資料，以及查詢統計資料的多種方式。透過這些功能，我們的目標是突破統計資料服務應有能力的極限。

我們以一款高度競爭的射擊遊戲為例，說明這些新功能如何協助我們解決一些問題。在這款遊戲中，有多種武器可讓玩家命中遠距離射擊。我們不只想追蹤遠距離射擊的距離，還想追蹤所使用子彈的口徑。

## 先決條件

完成[建立基本統計資料](/zh-TW/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 彙總，因此如果它通過前兩項驗證，就一律會被更新。

## 結論

在本教學課程中，我們學到了如何執行下列作業：

* 建立多資料行統計資料
* 查詢統計資料
* 了解平手判定的運作方式。

## 另請參閱

* [將內容資料新增至統計資料](/zh-TW/services/playfab/player-progression/statistics/metadata-statistics)。
* [建立基本統計資料](/zh-TW/services/playfab/player-progression/statistics/create-basic-statistics)。
* [季節性統計資料](/zh-TW/services/playfab/player-progression/statistics/seasonal-statistics)。
* [交易式寫入](/zh-TW/services/playfab/player-progression/statistics/transactional-writes)
* [API 參考](/zh-TW/services/playfab/player-progression/statistics/api-reference)。
* [限制](/zh-TW/services/playfab/player-progression/statistics/limits-statistics)。
* [配額](/zh-TW/services/playfab/player-progression/statistics/quota-statistics)


## Related topics

- [統計資料的限制](/zh-TW/services/playfab/player-progression/statistics/limits-statistics.md)
- [中繼資料統計資料](/zh-TW/services/playfab/player-progression/statistics/metadata-statistics.md)
- [統計資料 API 參考](/zh-TW/services/playfab/player-progression/statistics/api-reference.md)
- [社群統計資料](/zh-TW/services/playfab/player-progression/statistics/community-statistics.md)
- [季節性統計資料](/zh-TW/services/playfab/player-progression/statistics/seasonal-statistics.md)
