0% encontró este documento útil (0 votos)
16 vistas2 páginas

Ejercicios Funciones Analiticas Operadores Conjunto

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como TXT, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
16 vistas2 páginas

Ejercicios Funciones Analiticas Operadores Conjunto

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como TXT, PDF, TXT o lee en línea desde Scribd

-- Consulta de los cinco primeros empleados con m�s salario de la

-- compa�ia utilizando funciones an�liticas

SELECT *
FROM (SELECT employee_id,first_name,salary,
RANK() OVER (ORDER BY salary DESC) AS ranking_sueldo
FROM employees
) tabla_temp
WHERE ranking_sueldo <= 5;

-- Explicaci�n:
-- RANK() OVER (ORDER BY sueldo DESC):
-- Asigna un n�mero de ranking a cada empleado seg�n su sueldo,
-- del mayor al menor.

-- La subconsulta permite filtrar el ranking y dejar solo los cinco primeros.

-- Si hay sueldos iguales, RANK() dejar� huecos (por ejemplo: 1, 2, 2, 4...),


-- mientras que DENSE_RANK() no.

SELECT *
FROM (SELECT employee_id,first_name,salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS ranking_sueldo
FROM employees
) tabla_temp
WHERE ranking_sueldo <= 5;

--
-- Si prefiere exactamente cinco empleados �nicos
-- (sin importar empates en sueldo), puede usar ROW_NUMBER():
SELECT *
FROM (SELECT employee_id,first_name,salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS ranking_sueldo
FROM employees
) tabla_temp
WHERE ranking_sueldo <= 5;

--
--
--
-- Se seleccionan las columnas first_name, salary, y department_id.
-- Se usa la funci�n anal�tica RANK() con:
-- PARTITION BY department_id: reinicia el ranking dentro de cada departamento.
-- ORDER BY salary DESC: ordena los sueldos de mayor a menor en cada grupo.
-- El resultado de RANK() se llama top, que indica el lugar que ocupa
-- un empleado seg�n su sueldo dentro de su departamento.

select *
from (select first_name, salary, department_id, rank()
over (partition by department_id order by salary desc)
top from employees)
where top<=3

--
--
--
-- MAX(salary): calcula el sueldo m�s alto.
-- OVER (PARTITION BY department_id): lo calcula por cada grupo de empleados
-- dentro de un mismo departamento
-- (es decir, reinicia el c�lculo por cada department_id).
-- No se usa ORDER BY aqu� porque no se necesita ordenar:
-- solo queremos el valor m�ximo por grupo.
select first_name, salary, department_id, max(salary)
over (partition by department_id) dep_max_sal
from employees

-- Operadores de Conjunto
-- Mostrar todos los tipos de trabajo (job_id) que han existido,
-- tanto actuales como pasados, sin duplicados:
SELECT job_id FROM jobs
UNION
SELECT job_id FROM job_history;

-- Mostrar los trabajos que est�n en jobs (actuales),


-- pero que nunca se han usado en job_history.
SELECT job_id FROM jobs
MINUS
SELECT job_id FROM job_history;

-- ? Interpretar esta consulta.


SELECT job_id FROM employees
MINUS
SELECT job_id FROM job_history;

--
-- Salario promedio actual por cargo o trabajo actual
SELECT
e.job_id,
ROUND(AVG(e.salary), 2) AS salario_promedio_actual,
NULL AS salario_promedio_historico,
NULL AS diferencia
FROM employees e
GROUP BY e.job_id

--UNION ALL
-- MINUS

-- Salario promedio hist�rico por cargo o trabajo actual


-- (Para empleados que tuvieron cambios)
SELECT
jh.job_id,
NULL AS salario_promedio_actual,
ROUND(AVG(e.salary), 2) AS salario_promedio_historico,
NULL AS diferencia
FROM job_history jh
JOIN employees e ON jh.employee_id = e.employee_id
GROUP BY jh.job_id;

También podría gustarte