-- 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;