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

# Más operaciones con estadísticas

> Explore características avanzadas de las estadísticas de PlayFab, como el control de versiones, los metadatos, las escrituras transaccionales y las integraciones que amplían el seguimiento de la progresión

En este tutorial, vamos a tratar características más avanzadas que ofrece el servicio, como la creación de estadísticas
de varias columnas y varias formas de consultar estadísticas. Con estas características, pretendemos llevar al límite
lo que un servicio de estadísticas debería ser capaz de hacer.

Usamos un juego de disparos muy competitivo como ejemplo de cómo estas nuevas características podrían ayudarnos a resolver
algunos problemas. En este juego, hay varias armas que permiten al jugador acertar un tiro a larga distancia. Queremos registrar no
solo la distancia del tiro, sino también el calibre de la bala que se usó.

## Requisito previo

Complete los pasos descritos en [Creación de una estadística básica](/services/playfab/player-progression/statistics/create-basic-statistics).

## Creación de una definición de estadística de varias columnas

Para comenzar con este ejemplo, necesitamos crear una definición de estadística más compleja que la que teníamos antes.

Vamos a definir varias columnas para asignar los aspectos clave del tiro a larga distancia: distancias y calibre.
En el ejemplo siguiente se muestra cómo crear la definición de estadística mediante el SDK de 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);
}
```

El componente más importante aquí es el parámetro `Columns`, que permite varias definiciones de `StatisticColumn` para
que la estadística pueda tener varios valores. La única excepción es cuando usamos la agregación de `Sum`. Además, el número máximo de columnas permitidas es 5.

## Adición de datos a una estadística

Ahora que tenemos nuestra estadística creada, vamos a agregar datos. La principal diferencia con respecto a nuestro tutorial anterior sobre este tema es
que ahora necesitamos agregar dos valores diferentes. En el ejemplo siguiente se muestra cómo agregar datos a nuestra estadística
mediante el SDK de 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);
}
```

Aquí el punto principal reside en el parámetro `Scores` dentro de la estadística que se va a agregar. En el ejemplo de código,
vemos dos valores diferentes, todos ellos cadenas, pero se trata solo de una definición de entrada dentro de la estadística. Estos valores
se tratan como números. La longitud de la lista de puntuaciones siempre debe coincidir con el número de columnas de la definición
de estadística.

## Recuperación de datos de una estadística

Ahora vamos a aprender una forma de consultar varias entidades y obtener todas las estadísticas relacionadas con cada una de ellas.
En el ejemplo siguiente se muestra cómo agregar datos a nuestra estadística
mediante el SDK de 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

Cuando tenemos una definición de estadística de varias columnas, podríamos encontrarnos con un escenario que necesita desempate. Este
mecanismo funciona siguiendo el orden en que se agregaron las columnas. Cada vez que llega un nuevo valor, el sistema comprueba
si cumple los criterios de la agregación de la primera columna. En caso de que el valor sea el mismo, pasa a comprobar
los criterios de la segunda columna. Este comportamiento continúa con las columnas siguientes.

Por ejemplo, podemos tener una estadística con tres columnas:

* La primera columna tiene agregación Min.
* La segunda columna tiene agregación Max.
* La tercera columna tiene agregación Last.

Si llega un nuevo valor, debe ser menor que el de la primera columna. Luego debe ser mayor que el de la segunda columna.
Por último, la tercera columna está establecida en agregación Last, por lo que si supera las dos primeras validaciones, siempre se actualiza.

## Conclusión

En este tutorial, aprendimos a realizar las siguientes operaciones:

* Crear una estadística de varias columnas
* Consultar estadísticas
* Comprender cómo funciona el desempate.

## Consulte también

* [Adición de datos contextuales a las estadísticas](/services/playfab/player-progression/statistics/metadata-statistics)..
* [Creación de estadísticas básicas](/services/playfab/player-progression/statistics/create-basic-statistics).
* [Estadísticas de temporada](/services/playfab/player-progression/statistics/seasonal-statistics).
* [Escrituras transaccionales](/services/playfab/player-progression/statistics/transactional-writes)
* [Referencia de API](/services/playfab/player-progression/statistics/api-reference).
* [Límites](/services/playfab/player-progression/statistics/limits-statistics).
* [Cuota](/services/playfab/player-progression/statistics/quota-statistics)


## Related topics

- [Estadísticas con metadatos](/es/services/playfab/player-progression/statistics/metadata-statistics.md)
- [Estadísticas de temporada](/es/services/playfab/player-progression/statistics/seasonal-statistics.md)
- [Cuota de estadísticas](/es/services/playfab/player-progression/statistics/quota-statistics.md)
- [Límites de las estadísticas](/es/services/playfab/player-progression/statistics/limits-statistics.md)
- [Inicio rápido de estadísticas](/es/services/playfab/player-progression/statistics/quickstart-statistics.md)
