> ## 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 です。

## 統計情報にデータを追加する

統計情報を作成したので、データを追加していきます。この件に関する以前のチュートリアルとの主な違いは、今回は 2 つの異なる値を追加する必要があるという点です。次の例は、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` パラメーターです。コード例では 2 つの異なる値が確認できます。これらはすべて文字列ですが、統計情報内の入力定義に過ぎません。これらの値は数値として扱われます。スコアリストの長さは、常に統計情報の定義の列数と一致する必要があります。

## 統計情報からデータを取得する

ここでは、複数のエンティティをクエリし、それぞれに関連するすべての統計情報を取得する方法を学びます。次の例は、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)}");
        }
    }

}
```

### タイブレーク

複数列の統計情報の定義がある場合、タイブレークが必要なシナリオに遭遇することがあります。このメカニズムは、列が追加された順序に従って動作します。新しい値が入ってくると、システムは最初の列の集計基準を満たすかどうかを確認します。値が同じ場合は、次に 2 列目の基準を確認します。この動作は以降の列でも続きます。

たとえば、3 つの列を持つ統計情報を持つとします。

* 最初の列は Min 集計を持ちます。
* 2 番目の列は Max 集計を持ちます。
* 3 番目の列は Last 集計を持ちます。

新しい値が入ってきた場合、それは最初の列より小さい必要があります。次に、2 番目の列より大きい必要があります。最後に、3 番目の列は Last 集計に設定されているため、最初の 2 つの検証を満たす場合は常に更新されます。

## まとめ

このチュートリアルでは、次の操作の方法を学びました。

* 複数列の統計情報の作成
* 統計情報のクエリ
* タイブレークの仕組みの理解

## 関連項目

* [統計情報にコンテキストデータを追加する](/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

- [メタデータ統計情報](/ja-jp/services/playfab/player-progression/statistics/metadata-statistics.md)
- [シーズナル統計情報](/ja-jp/services/playfab/player-progression/statistics/seasonal-statistics.md)
- [基本的な統計情報を作成する](/ja-jp/services/playfab/player-progression/statistics/create-basic-statistics.md)
- [統計情報の制限](/ja-jp/services/playfab/player-progression/statistics/limits-statistics.md)
- [統計情報のクォータ](/ja-jp/services/playfab/player-progression/statistics/quota-statistics.md)
