> ## 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 统计数据功能，包括版本控制、元数据、事务性写入和扩展进度跟踪的集成

在本教程中，我们将介绍此服务提供的更多高级功能，例如创建多列统计数据以及查询统计数据的多种方式。通过这些功能，我们旨在突破统计数据服务应具备的能力界限。

我们以一款竞争激烈的射击游戏为例，展示这些新功能如何帮助我们解决一些问题。在这款游戏中，有多种武器可以让玩家实现远距离射击。我们不仅想跟踪远距离射击的距离，还想跟踪所用子弹的口径。

## 先决条件

完成[创建基本统计数据](/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 参考](/zh-CN/services/playfab/player-progression/statistics/api-reference.md)
- [社区统计数据](/zh-CN/services/playfab/player-progression/statistics/community-statistics.md)
- [统计数据限制](/zh-CN/services/playfab/player-progression/statistics/limits-statistics.md)
- [元数据统计](/zh-CN/services/playfab/player-progression/statistics/metadata-statistics.md)
- [创建基本统计数据](/zh-CN/services/playfab/player-progression/statistics/create-basic-statistics.md)
