De ventanaestándar SQL

CUME_DIST

Muestra la proporción de filas que quedan por delante de la actual o empatan con ella, de 0 a 1.

Sintaxis

CUME_DIST() OVER (ORDER BY <criterio de orden>)
CUME_DIST() OVER (PARTITION BY <grupo> ORDER BY <criterio de orden>)

Calcula (filas hasta la actual, empates incluidos) / (todas las filas). A diferencia de PERCENT_RANK, nunca da 0: la primera fila recibe como mínimo 1 / cantidad, y la última, siempre 1. Útil para frases como «el 80 % de las personas gana lo mismo o menos».

Datos para los ejemplos

employees

namedepartmentsalarybonusphone
Emmabackend1200300+44 7700 900123
Liambackend1000NULLNULL
Oliviafrontend1350150+44 7700 900456
Noahfrontend950NULL+44 7700 900789
Sophiadesign1200200NULL

Estas tablas ya están creadas en el entorno de pruebas y los ejemplos de abajo las usan. ¿Quieres repetirlo en tu propia base de datos? Copia el SQL.

La proporción por salario
SELECT name, salary,
CUME_DIST() OVER (ORDER BY salary) AS cume_dist
FROM employees;
namesalarycume_dist
Noah9500.2
Liam10000.4
Emma12000.8
Sophia12000.8
Olivia13501
En porcentaje
SELECT name, salary,
ROUND(CUME_DIST() OVER (ORDER BY salary) * 100) AS at_most_percent
FROM employees;
namesalaryat_most_percent
Noah95020
Liam100040
Emma120080
Sophia120080
Olivia1350100

El 80 % de las personas gana lo mismo que Emma o menos.

PERCENT_RANK y CUME_DIST lado a lado
SELECT name, salary,
PERCENT_RANK() OVER (ORDER BY salary) AS percent_rank,
CUME_DIST() OVER (ORDER BY salary) AS cume_dist
FROM employees;
namesalarypercent_rankcume_dist
Noah95000.2
Liam10000.250.4
Emma12000.50.8
Sophia12000.50.8
Olivia135011

Ten en cuenta

Los valores iguales reciben el mismo resultado y se cuentan juntos: Emma y Sophia tienen 0.8, porque cuatro de cinco ganan 1200 o menos.

No hay cero ni siquiera para el valor más pequeño. Si la primera fila debe tener 0, usa PERCENT_RANK.

El resultado es una fracción, no un porcentaje: para el porcentaje, multiplica por 100.

Funciones relacionadas