> ## 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.

# Fazendo mais com estatísticas

> Explore os recursos avançados de estatísticas do PlayFab, incluindo controle de versão, metadados, gravações transacionais e integrações que ampliam o acompanhamento da progressão

Neste tutorial, vamos abordar recursos mais avançados que o serviço tem a oferecer, como a criação de estatísticas com várias
colunas e várias maneiras de consultar estatísticas. Com esses recursos, nosso objetivo é ampliar
os limites do que um serviço de estatísticas deve ser capaz de fazer.

Estamos usando um jogo de tiro altamente competitivo como exemplo de como esses novos recursos podem nos ajudar a resolver
alguns problemas. Neste jogo, há várias armas que permitem ao jogador acertar um tiro de longa distância. Queremos acompanhar não
apenas a distância do tiro, mas também o calibre da bala usada.

## Pré-requisito

Conclua as etapas em [Criar uma estatística básica](/pt-BR/services/playfab/player-progression/statistics/create-basic-statistics).

## Criando uma definição de estatística com várias colunas

Para começar este exemplo, precisamos criar uma definição de estatística mais complexa do que a que tínhamos antes.

Vamos definir várias colunas para mapear os principais aspectos do tiro de longa distância: as distâncias e o calibre.
O exemplo a seguir mostra como criar a definição de estatística usando o SDK do C#.

```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);
}
```

O componente mais importante aqui é o parâmetro `Columns`, que permite várias definições de `StatisticColumn` para
que a estatística possa ter vários valores. A única exceção é quando usamos a agregação `Sum`. Além disso, o número máximo de colunas permitido é 5.

## Adicionando dados a uma estatística

Agora que criamos nossa estatística, vamos adicionar dados. A principal diferença em relação ao nosso tutorial anterior sobre este assunto é
que agora precisamos adicionar dois valores diferentes. O exemplo a seguir mostra como adicionar dados à nossa estatística
usando o SDK do C#.

```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);
}
```

Aqui, o ponto principal está no parâmetro `Scores` da estatística que será adicionada. No exemplo de código,
vemos dois valores diferentes, ambos cadeias de caracteres, mas isso é apenas uma definição de entrada da estatística. Esses valores
são tratados como números. O tamanho da lista de pontuações sempre deve corresponder ao número de colunas da definição
da estatística.

## Recuperando dados de uma estatística

Agora vamos aprender uma maneira de consultar várias entidades e obter todas as estatísticas relacionadas a cada uma delas.
O exemplo a seguir mostra como adicionar dados à nossa estatística
usando o SDK do C#.

```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)}");
        }
    }

}
```

### Desempate

Quando temos uma definição de estatística com várias colunas, podemos nos deparar com um cenário que precisa de desempate. Esse
mecanismo funciona seguindo a ordem em que as colunas foram adicionadas. Sempre que um novo valor chega, o sistema verifica
se ele atende aos critérios da agregação da primeira coluna. Caso o valor seja o mesmo, ele verifica
os critérios da segunda coluna. Esse comportamento continua nas colunas seguintes.

Por exemplo, podemos ter uma estatística com três colunas:

* A primeira coluna tem agregação Min.
* A segunda coluna tem agregação Max.
* A terceira coluna tem agregação Last.

Se um novo valor chegar, ele precisará ser menor que o da primeira coluna. Em seguida, precisará ser maior que o da segunda coluna.
Por fim, a terceira coluna está definida com agregação Last; portanto, se ele atender às duas primeiras validações, sempre será atualizado.

## Conclusão

Neste tutorial, aprendemos a fazer as seguintes operações:

* Criar uma estatística com várias colunas
* Consultar estatísticas
* Entender como o desempate funciona.

## Confira também

* [Adicionar dados contextuais às estatísticas](/pt-BR/services/playfab/player-progression/statistics/metadata-statistics)..
* [Criar estatísticas básicas](/pt-BR/services/playfab/player-progression/statistics/create-basic-statistics).
* [Estatísticas sazonais](/pt-BR/services/playfab/player-progression/statistics/seasonal-statistics).
* [Gravações transacionais](/pt-BR/services/playfab/player-progression/statistics/transactional-writes)
* [Referência de API](/pt-BR/services/playfab/player-progression/statistics/api-reference).
* [Limites](/pt-BR/services/playfab/player-progression/statistics/limits-statistics).
* [Cota](/pt-BR/services/playfab/player-progression/statistics/quota-statistics)


## Related topics

- [Estatísticas com metadados](/pt-BR/services/playfab/player-progression/statistics/metadata-statistics.md)
- [Estatísticas sazonais](/pt-BR/services/playfab/player-progression/statistics/seasonal-statistics.md)
- [Estatísticas da comunidade](/pt-BR/services/playfab/player-progression/statistics/community-statistics.md)
- [Limites das estatísticas](/pt-BR/services/playfab/player-progression/statistics/limits-statistics.md)
- [Cota de estatísticas](/pt-BR/services/playfab/player-progression/statistics/quota-statistics.md)
