Está en la página 1de 28

PEA:

Programa de Especialización Analítica


BUSINESS INTELLIGENCE DEVELOPER

Expositor:
Willy Valladares

Julio 2016
Estructura
1 SQL Avanzado (BD2)

Parte 1 – Manejo transact SQL Avanzado Parte 2 – Manejo sobre Tablas

Conceptos y Oracle Express GROUPING, SET, CUBE, ROLLUP

Filtrados: IN, ANY, SOME, ALL, Exists Pivoteo de Tablas: Pivot / unPivot

Subconsultas Particiones y funciones de Agregacion

Funciones y Operadores de Conjuntos Ordenamiento de Registros

Otras Funciones: Coalesce, isNull, Nullif

Parte 3 – Otros Procedimientos SQL

Creacion de Vistas / Vistas Materializadas

Creacion de Funciones, Store Procedure


Ejercicios y Q&A
Creacion de Triggers

Expositor: Willy Valladares


SESION 6:
Funciones Analíticas
Sesion 6 – SQL Avanzado
1 Particionamiento: Partition by

FUNCTION_NAME( argument,argument,… )
OVER
( Partition-Clause Order-by-Clause Windowing-Clause)

Funciones:
SUM COUNT AVG MIN MAX
Syntax: Windowing -Clause
[ROW or RANGE] <start_expr> BETWEEN AND <end_expr>

<start_expr> puede tener las siguiente opciones:


- UNBOUNDED PRECEDING
- CURRENT ROW
- <sql_expr> PRECEDING or FOLLOWING.
<end_expr> puede tener las siguiente opciones:
- UNBOUNDED FOLLOWING
- CURRENT ROW
- <sql_expr> PRECEDING or FOLLOWING.
Ejemplo,
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW indica que la
ventana de filas en la que opera la función tiene un tamaño de tres filas,
Expositor: Willy Valladares con dos filas delante hasta e inclusive la fila actual.
Sesion 6 – SQL Avanzado
1 Particionamiento: Partition by

select last_name, first_name, salary,


SUM (salary)
OVER (ORDER BY last_name, first_name) Total
from HR.employees
order by last_name, first_name;

Expositor: Willy Valladares


Sesion 6 – SQL Avanzado
1 Particionamiento: Partition by

select last_name, first_name, salary,


SUM (salary)
OVER (PARTITION BY department_id
ORDER BY last_name, first_name) Total
from HR.employees
order by department_id, last_name, first_name;

Expositor: Willy Valladares


Sesion 6 – SQL Avanzado
1 Particionamiento: Partition by

select last_name, first_name, salary,


SUM (salary)
OVER (PARTITION BY department_id
ORDER BY salary) Total
from HR.employees
order by department_id, salary, last_name, first_name;

Expositor: Willy Valladares


Sesion 6 – SQL Avanzado
1 Particionamiento: Partition by

select last_name, first_name, salary,


SUM (salary)
OVER (PARTITION BY department_id
ORDER BY salary) Total
from HR.employees
order by department_id, last_name, first_name;

Expositor: Willy Valladares


Sesion 6 – SQL Avanzado
1 Particionamiento: Partition by

select last_name, first_name, department_id, salary,


SUM (salary)
OVER (PARTITION BY department_id ORDER BY last_name,
first_name ROWS 2 PRECEDING) department_total
from HR.employees
order by department_id, last_name, first_name;

Expositor: Willy Valladares


Sesion 6 – SQL Avanzado
1 Particionamiento: Partition by
select last_name, first_name, department_id,
hire_date, salary,
SUM (salary)
OVER (PARTITION BY department_id ORDER BY hire_date
RANGE 365 PRECEDING) department_total
From hr.employees
ORDER by department_id, hire_date;

Expositor: Willy Valladares


Sesion 6 – SQL Avanzado
1 Funciones Analíticas: Análisis de N principales

Las consultas de N principales solicitan los n valores


más grandes o más pequeños de una columna.

Ejemplo:
– ¿Cuáles son los diez productos más vendidos?
– ¿Cuáles son los diez productos menos vendidos?

Tanto los juegos de valores más grandes como los


más pequeños se consideran consultas de N
principales.

Expositor: Willy Valladares


Sesion 6 – SQL Avanzado
1 Funciones Analíticas: ROWNUM

La estructura de nivel superior de una consulta de


análisis de N principales es:
SELECT [column_list], ROWNUM
FROM (SELECT [column_list]
FROM table
ORDER BY Top-N_column)
WHERE ROWNUM <= N;

Expositor: Willy Valladares


Sesion 6 – SQL Avanzado
1 Funciones Analíticas: ROWNUM

Para visualizar los salarios y los nombres de los tres empleados


que más ganan desde la tabla EMPLOYEES:
1 2 3

SELECT ROWNUM as ORDEN, last_name, salary


FROM (SELECT last_name,salary FROM employees
ORDER BY salary DESC)
WHERE ROWNUM <= 3;

1 2 3

Expositor: Willy Valladares


Sesion 6 – SQL Avanzado
1 Funciones Analíticas: ROW_NUMBER

Otra manera de escribir queries del tipo top-n es usar la función analítica
ROW_NUMBER. Esta se comporta de manera similar a la pseudocolumna
ROWNUM pero es mas flexible y posee mas capacidades.

select first_name, last_name, salary,


row_number()
over (order by salary desc) rn
from HR.empLOYEES
order by salary desc

Expositor: Willy Valladares


Sesion 6 – SQL Avanzado
1 Funciones Analíticas: ROW_NUMBER

Otra manera de escribir queries del tipo top-n es usar la función analítica
ROW_NUMBER. Esta se comporta de manera similar a la pseudocolumna
ROWNUM pero es mas flexible y posee mas capacidades.

select first_name, last_name, salary,


row_number()
over (order by salary desc) rn
from HR.empLOYEES
order by salary desc

Expositor: Willy Valladares


Sesion 6 – SQL Avanzado
1 Funciones Analíticas: ROW_NUMBER

Si deseo los 3 primeros?

select * from
(
select first_name, last_name, salary,
row_number()
over (order by salary desc) rn
from HR.empLOYEES
)
where rn <=3
order by salary desc

Existen 2
valores
iguales en
Expositor: Willy Valladares
salario..
Sesion 6 – SQL Avanzado
1 Funciones Analíticas: RANK, DENSE_RANK

Cuando se ordena por atributo que no es único en un query tipo


top-n se puede usar otra función analítica: RANK y DENSE_RANK
select first_name, last_name, salary,
row_number()
over (order by salary desc) rn
,rank()
over (order by salary desc) rnk
,dense_rank()
over (order by salary desc) drnk
from HR.EMPLOYEES
order by salary desc

Expositor: Willy Valladares


Sesion 6 – SQL Avanzado
1 Funciones Analíticas: Row_Number, RANK, DENSE_RANK

- ROW_NUMBER asigna números contiguos y únicos desde 1..N a todo el


resultset.
- RANK no asigna números únicos – Kochhar y De Haan están empatados
en el segundo puesto- y tampoco asigna números contiguos. Ningún
registro tuvo el numero 3, debido a que dos personas están empatadas en
el segundo puesto.
- DENSE_RANK, al igual que RANK, no asigna números únicos, pero si
asigna números contiguos. Mas allá de que dos registros estén empatados
en el segundo lugar, existe un registro que tiene el tercer puesto.

Expositor: Willy Valladares


Sesion 6 – SQL Avanzado
1 Funciones Analíticas: Top-N query agrupado por algo

Para cada departamento.


select department_id, first_name, last_name, salary,
row_number()
over (partition by department_id
order by salary desc)rn,
rank()
over (partition by department_id
order by salary desc)rnk,
dense_rank()
over (partition by department_id
order by salary desc)drnk
from hr.employees
order by department_id, salary desc

Expositor: Willy Valladares


Sesion 6 – SQL Avanzado
1 Funciones Analíticas: Top-N query agrupado por algo

Para cada departamento, buscar los 3 mejores pagados.


select * from (
select department_id, first_name, last_name, salary,
dense_rank()
over (partition by department_id
order by salary desc)drnk
from hr.employees
) where drnk <= 3
order by department_id, salary desc

Utilizamos la clausula
PARTITION, la cual parte el
resultado en un numero
determinado de grupos y luego
aplica las funciones analíticas a
cada grupo, reseteando el
contador a medida que pasa de
grupo a grupo

Expositor: Willy Valladares


Sesion 6 – SQL Avanzado
1 Funciones Analíticas: LAG y LEAD

Con las funciones LAG() y LEAD() se obtienen el valor anterior o posterior en


una lista ordenada. Con estas funciones se evita la necesidad de realizar un
join con la misma tabla.

LAG: Obtendría el valor del registro anterior


LEAD: Obtendría el valor del registro posterior

LAG / LEAD (value_expression [,offset] [,default])


OVER ([query_partition_clause] order_by_clause)

Expresion_valor_1 – Puede ser una columna u otra función no analítica a obtener


Expresion_valor_3, Expresion_valor_4, … – Puede ser una columna u otra función no analítica a
obtener
Expresion_valor_1 – Puede ser una columna u otra función no analítica a obtener
offset – Número de registros anteriores o posteriores al registro en curso. Por defecto 1.
valor_por_defecto – Valor que toma, si se sale del rango. Por ejemplo, si se evalua primer
registro y se intenta obtener dato de uno anterior. Por defecto es nulo.
Expositor: Willy Valladares
Sesion 6 – SQL Avanzado
1 Funciones Analíticas: LAG y LEAD

SELECT last_name,
LAG(last_name) OVER (ORDER BY last_name) Apellido_previo,
LEAD(last_name) OVER (ORDER BY last_name) Apellido_posterior
FROM HR.employees;

Expositor: Willy Valladares


Sesion 6 – SQL Avanzado
1 Ordenamiento: Random Sorting

SELECT column FROM

( SELECT column FROM table

ORDER BY dbms_random.value )

WHERE rownum < 5

DBMS_RANDOM.RANDOM produces integers in [-2^^31, 2^^31).


DBMS_RANDOM.VALUE produces numbers in [0,1) with 38 digits of precision.

SELECT *
FROM (SELECT a.*,
DBMS_RANDOM.VALUE
FROM HR.employees a
ORDER BY
DBMS_RANDOM.VALUE)
where ROWNUM < 5;

Expositor: Willy Valladares


SESION 6:
Ejercicios
Sesion 5 – SQL Avanzado
2 EJERCICIO 1

Realizar el siguiente Reporte

Con la informacion de Deudores del Sistema Financiero (SBSHISTent_30K) obtener el


promedio de Deuda de Consumo (expresado en Miles) a 3Meses, 6Meses y 12Meses a
nivel de Entidad Financiera.

Al final podemos seleccionar cualquier mes sobre este calculo. Por ejemplo 201601.

Expositor: Willy Valladares


Sesion 5 – SQL Avanzado
2 EJERCICIO 2

Realizar el siguiente Reporte

Indicar los 25 deudores top del sistema financiero a nivel de Deuda Consumo (exp. En
Miles), indicando su nombre y banco.

Mostrar los 3 tipos de ranking con RowNum, Rank y Dense_rank

Expositor: Willy Valladares


Sesion 5 – SQL Avanzado
2 EJERCICIO 3

Realizar el siguiente Reporte de Participación de Mercado Consumo para Grupo Scotia


Market Share: Participación de Mercado de la Entidad Financiera respecto a todo el
sistema financiera.
- Grupo Scotia: Entidades que en la table RCC_BANCOS contenga '%SCOTIA%‘
- Region: Si Departamento es Lima es Lima sino es Provincia.

Expositor: Willy Valladares


Gracias

También podría gustarte