Sunteți pe pagina 1din 27

Funciones Analíticas

Oracle Functions
Single-row Functions Aggegate Functions

SELECT ABS(salario) SELECT MIN(salario)


FROM Empleados; FROM Empleados;
Single-row Functions Aggegate Functions

Retornan una fila resultado Retornan una fila resultado


por cada fila de una tabla o vista. dado un grupo de filas.

f
f
f

ff f
f
f
f

f
Analitic Functions
Analitic Functions

Computan un valor por cada grupo de filas de una tabla o vista.


Difieren de las de Agregado en que retornan múltiples filas por cada grupo.
Las cláusulas analíticas permiten definir ventanas de aplicación de la función.

Window f

Partition f
Analitic Functions

Son el último conjunto de operaciones ejecutadas en una


consulta, excepto el ORDER BY final.

Todas las cláusulas JOIN, WHERE, GROUP BY y HAVING son


terminadas antes de que la función analítica sea ejecutada.

Las funciones analíticas sólo pueden aparecer en la lista de un


SELECT o en una cláusula ORDER BY.
Analitic Functions

AVG * NTILE
CORR * PERCENT_RANK
COVAR_POP * PERCENTILE_CONT
COVAR_SAMP * PERCENTILE_DISC
COUNT * RANK
CUME_DIST RATIO_TO_REPORT
DENSE_RANK REGR_ (Linear Regression) Functions *
FIRST ROW_NUMBER
FIRST_VALUE * STDDEV *
LAG STDDEV_POP *
LAST STDDEV_SAMP *
LAST_VALUE * SUM *
LEAD VAR_POP *
MAX * VAR_SAMP *
MIN * VARIANCE *
AVG*

Retorna el promedio del valor de la expresión.


Ejemplo AVG
SELECT manager_id, last_name, hire_date, salary, AVG(salary)
OVER (PARTITION BY manager_id ORDER BY hire_date
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS c_mavg
FROM employees
ORDER BY manager_id, last_name, hire_date, salary, AVG(salary);
CORR *

Retorna el coeficiente de correlación de un conjunto de números de pares


Ejemplo CORR
SELECT employee_id, job_id,
TO_CHAR((SYSDATE - hire_date) YEAR TO MONTH ) "Yrs-Mns",
salary,
CORR(SYSDATE-hire_date, salary)
OVER(PARTITION BY job_id) AS "Correlation"
FROM employees WHERE department_id in (50, 80)
ORDER BY job_id, employee_id;
COUNT*

Retorna el número de filas de la consulta. Si se especifica expr retorna los


valores no nulos, si expr=* retorna las filas duplicadas y nulas.
Ejemplo COUNT
SELECT last_name, salary, COUNT(*)
OVER (ORDER BY salary
RANGE BETWEEN 50 PRECEDING AND 150 FOLLOWING)
AS mov_count
FROM employees ORDER BY last_name, salary, COUNT(*);
FIRST_VALUE*

Retorna el primer valor en un conjunto de valores ordenados. Si el primer


valor es null, entonces se retorna null, a no ser que se especifique IGNORE
NULLS
Ejemplo FIRST_VALUE
SELECT department_id, last_name, salary, FIRST_VALUE(last_name)
OVER (ORDER BY salary ASC ROWS UNBOUNDED PRECEDING)
AS lowest_sal
FROM
(SELECT * FROM employees WHERE department_id = 90 ORDER BY employee_id)
ORDER BY department_id, last_name, salary, lowest_sal;
MAX *

Retorna el máximo valor de la expresión.


Ejemplo MAX
SELECT manager_id, last_name, salary, MAX(salary)
OVER (PARTITION BY manager_id) AS mgr_max
FROM employees
ORDER BY manager_id, last_name, salary, mgr_max;
NTILE

Divide un conjunto de datos ordenados en un número de “grupos” definido


por expr y asigna a cada fila el número del grupo correspondiente.

Los grupos son enumerados de 1 a expr.


NTILE
SELECT last_name, salary, NTILE(4)
OVER (ORDER BY salary DESC) AS quartile
FROM employees
WHERE department_id = 100
ORDER BY last_name, salary, quartile;
RANK

Calcula la posición de un valor dentro de un conjunto de valores.


RANK

SELECT department_id, last_name, salary, commission_pct, RANK()


OVER (PARTITION BY department_id
ORDER BY salary DESC, commission_pct) "Rank"
FROM employees
ORDER BY department_id, last_name, salary, commission_pct, "Rank";
SUM*

Retorna la suma de los valores de expr.


SUM*
SELECT manager_id, last_name, salary, SUM(salary)
OVER (PARTITION BY manager_id
ORDER BY salary
RANGE UNBOUNDED PRECEDING) l_csum
FROM employees
ORDER BY manager_id, last_name, salary, l_csum;
ROW NUMBER

Asigna un número a cada fila sobre la que es aplicada (único en la partición o


único en la consulta)
ROW NUMBER
SELECT department_id, first_name, last_name, salary
FROM
(
SELECT department_id, first_name, last_name, salary,
ROW_NUMBER()
OVER (PARTITION BY department_id
ORDER BY salary desc) rn
FROM employees
)
WHERE rn <= 3
ORDER BY department_id, salary DESC, last_name;
OTRAS

SELECT department_id, last_name, hire_date, salary,


STDDEV_SAMP(salary)
OVER (PARTITION BY department_id ORDER BY hire_date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cum_sdev
FROM employees
ORDER BY department_id, last_name, hire_date, salary, cum_sdev;

S-ar putea să vă placă și