$percentile

El $percentile operador calcula el percentil de los valores numéricos que coinciden con un criterio de filtrado. Este operador es especialmente útil para identificar umbrales estadísticos, como medianas o percentiles.

Syntax

$percentile: {
    input: < field or expression > ,
    p: [ < percentile values > ],
    method: < method >
}

Parámetros

Parámetro Description
input Especifica los datos numéricos a partir de los que se va a calcular el percentil.
p Matriz de valores de percentil (entre 0 y 1) que se va a calcular.
method Especifica el método de interpolación que se va a usar. Los valores válidos son "approximate" y "continuous".

Examples

Considere este documento de ejemplo de la colección de tiendas.

{
    "_id": "0fcc0bf0-ed18-4ab8-b558-9848e18058f4",
    "name": "First Up Consultants | Beverage Shop - Satterfieldmouth",
    "location": {
        "lat": -89.2384,
        "lon": -46.4012
    },
    "staff": {
        "totalStaff": {
            "fullTime": 8,
            "partTime": 20
        }
    },
    "sales": {
        "totalSales": 75670,
        "salesByCategory": [
            {
                "categoryName": "Wine Accessories",
                "totalSales": 34440
            },
            {
                "categoryName": "Bitters",
                "totalSales": 39496
            },
            {
                "categoryName": "Rum",
                "totalSales": 1734
            }
        ]
    },
    "promotionEvents": [
        {
            "eventName": "Unbeatable Bargain Bash",
            "promotionalDates": {
                "startDate": {
                    "Year": 2024,
                    "Month": 6,
                    "Day": 23
                },
                "endDate": {
                    "Year": 2024,
                    "Month": 7,
                    "Day": 2
                }
            },
            "discounts": [
                {
                    "categoryName": "Whiskey",
                    "discountPercentage": 7
                },
                {
                    "categoryName": "Bitters",
                    "discountPercentage": 15
                },
                {
                    "categoryName": "Brandy",
                    "discountPercentage": 8
                },
                {
                    "categoryName": "Sports Drinks",
                    "discountPercentage": 22
                },
                {
                    "categoryName": "Vodka",
                    "discountPercentage": 19
                }
            ]
        },
        {
            "eventName": "Steal of a Deal Days",
            "promotionalDates": {
                "startDate": {
                    "Year": 2024,
                    "Month": 9,
                    "Day": 21
                },
                "endDate": {
                    "Year": 2024,
                    "Month": 9,
                    "Day": 29
                }
            },
            "discounts": [
                {
                    "categoryName": "Organic Wine",
                    "discountPercentage": 19
                },
                {
                    "categoryName": "White Wine",
                    "discountPercentage": 20
                },
                {
                    "categoryName": "Sparkling Wine",
                    "discountPercentage": 19
                },
                {
                    "categoryName": "Whiskey",
                    "discountPercentage": 17
                },
                {
                    "categoryName": "Vodka",
                    "discountPercentage": 23
                }
            ]
        }
    ]
}

Ejemplo 1: Calcular el percentil 50 del volumen de ventas

Esta consulta calcula el percentil 50 (mediana) del volumen total de ventas dentro de cada categoría de ventas en todas las tiendas.

db.stores.aggregate([{
        $unwind: "$sales.salesByCategory"
    },
    {
        $group: {
            _id: null,
            medianSales: {
                $percentile: {
                    input: "$sales.salesByCategory.totalSales",
                    p: [0.5],
                    method: "approximate"
                }
            }
        }
    }
])

Esta consulta devuelve el siguiente resultado:

[
    {
        "_id": null,
        "medianSales": [
            25070.449624139295
        ]
    }
]

Ejemplo 2: Cálculo de varios percentiles

Esta consulta calcula los percentiles 25, 50 y 75 del total de ventas en todas las tiendas.

db.stores.aggregate([{
    $group: {
        _id: null,
        percentiles: {
            $percentile: {
                input: "$sales.fullSales",
                p: [0.25, 0.5, 0.75],
                method: "approximate"
            }
        }
    }
}])

Esta consulta devuelve el siguiente resultado:

[
    {
        "_id": null,
        "percentiles": [
            3700,
            3700,
            3700
        ]
    }
]