PERCENTILE_DISC (Transact-SQL)
Se aplica a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Calcula un percentil concreto para los valores ordenados de un conjunto de filas completo o dentro de particiones distintas de un conjunto de filas de SQL Server. Para un valor de percentil determinado P, PERCENTILE_DISC ordena los valores de expresión en la cláusula ORDER BY. A continuación, devuelve el valor con el menor valor de CUME_DIST dado (con respecto a la misma especificación de ordenación) que es mayor o igual que P. Por ejemplo, PERCENTILE_DISC (0.5) calculará el cincuentavo percentil (es decir, la mediana) de una expresión. PERCENTILE_DISC calcula el percentil basándose en una distribución discreta de los valores de columna; el resultado es igual a un valor específico de la columna.
Convenciones de sintaxis de Transact-SQL
Sintaxis
PERCENTILE_DISC ( numeric_literal ) WITHIN GROUP ( ORDER BY order_by_expression [ ASC | DESC ] )
OVER ( [ <partition_by_clause> ] )
Nota:
Para ver la sintaxis de Transact-SQL para SQL Server 2014 y versiones anteriores, consulte Versiones anteriores de la documentación.
Argumentos
literal
El percentil que se va a calcular. El valor debe estar entre 0,0 y 1,0.
WITHIN GROUP ( ORDER BY order_by_expression [ ASC | DESC)**
Especifica una lista de valores para ordenar y cuyo percentil se va a calcular. Solo se permite una order_by_expression. El criterio de ordenación predeterminado es ascendente. La lista de valores puede ser de cualquiera de los tipos de datos válidos para la operación de ordenación.
OVER (<partition_by_clause>)**
Divide el conjunto de resultados de la cláusula FROM en particiones. La función percentile se aplica a estas particiones. Para más información, vea Cláusula OVER (Transact-SQL). Las cláusulas <ORDER BY clause> y <rows or range clause> no se pueden especificar en una función PERCENTILE_DISC.
Tipos de valor devuelto
El tipo de valor devuelto viene determinado por el tipo order_by_expression.
Soporte de compatibilidad
En el nivel de compatibilidad 110 y posteriores, WITHIN GROUP es una palabra clave reservada. Para obtener más información, vea Nivel de compatibilidad de ALTER DATABASE (Transact-SQL).
Notas generales
Se omite cualquier valor NULL del conjunto de datos.
PERCENTILE_DISC es no determinista. Para obtener más información, consulte Deterministic and Nondeterministic Functions.
Ejemplos
Ejemplo de sintaxis básica
En el ejemplo siguiente se usa PERCENTILE_CONT y PERCENTILE_DISC para buscar el salario medio de los empleados de cada departamento. Tenga en cuenta que puede que estas funciones no devuelvan el mismo valor:
- PERCENTILE_CONT devuelve el valor adecuado, aunque no exista en el conjunto de datos.
- PERCENTILE_DISC devuelve un valor real del conjunto.
USE AdventureWorks2012;
SELECT DISTINCT Name AS DepartmentName
,PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY ph.Rate)
OVER (PARTITION BY Name) AS MedianCont
,PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY ph.Rate)
OVER (PARTITION BY Name) AS MedianDisc
FROM HumanResources.Department AS d
INNER JOIN HumanResources.EmployeeDepartmentHistory AS dh
ON dh.DepartmentID = d.DepartmentID
INNER JOIN HumanResources.EmployeePayHistory AS ph
ON ph.BusinessEntityID = dh.BusinessEntityID
WHERE dh.EndDate IS NULL;
A continuación se muestra un conjunto parcial de resultados.
DepartmentName MedianCont MedianDisc
Document Control 16.8269 16.8269
Engineering 34.375 32.6923
Executive 54.32695 48.5577
Human Resources 17.427850 16.5865
Ejemplos: Azure Synapse Analytics y Sistema de la plataforma de análisis (PDW)
Ejemplo de sintaxis básica
En el ejemplo siguiente se usa PERCENTILE_CONT y PERCENTILE_DISC para buscar el salario medio de los empleados de cada departamento. Tenga en cuenta que puede que estas funciones no devuelvan el mismo valor:
- PERCENTILE_CONT devuelve el valor adecuado, aunque no exista en el conjunto de datos.
- PERCENTILE_DISC devuelve un valor real del conjunto.
-- Uses AdventureWorks
SELECT DISTINCT DepartmentName
,PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY BaseRate)
OVER (PARTITION BY DepartmentName) AS MedianCont
,PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY BaseRate)
OVER (PARTITION BY DepartmentName) AS MedianDisc
FROM dbo.DimEmployee;
A continuación se muestra un conjunto parcial de resultados.
DepartmentName MedianCont MedianDisc
-------------------- ---------- ----------
Document Control 16.826900 16.8269
Engineering 34.375000 32.6923
Human Resources 17.427850 16.5865
Shipping and Receiving 9.250000 9.0000