SQLize Online / PHPize Online  /  SQLtest Online

A A A
Share      Blog   Popular
Copy Format Clear
/* Сохранить пример CREATE TABLE employees ( employee_id INT, salary NUMERIC, department_id INT ); INSERT INTO employees (employee_id, salary, department_id) SELECT id, 40000 + (random() * 60000)::INT, -- Случайная зарплата от 40,000 до 100,000 101 + (random() * 5)::INT -- Случайный department_id от 101 до 105 FROM generate_series(1, 50) AS id; -- Генерация 50 строк SELECT e.employee_id, e.salary, e.department_id FROM employees e WHERE e.salary > (SELECT AVG(salary) FROM employees WHERE department_id = e.department_id); */ /* У тебя есть таблица employees: CREATE TABLE employees ( employee_id INT, salary NUMERIC, department_id INT ); INSERT INTO employees (employee_id, salary, department_id) VALUES (1, 50000, 101), (2, 60000, 102), (3, 72000, 101), (4, 70000, 103), (5, 65000, 102), (6, 48000, 103), (7, 72000, 101), (8, 53000, 104), (9, 62000, 105), (10, 58000, 101); Нужно написать запрос, который для каждого отдела (department_id) выведет: employee_id, salary, Ранг сотрудника по зарплате внутри отдела (используй оконную функцию RANK()). WITH EmployeesSalaryRank as ( SELECT employee_id, department_id, salary, RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) as salary_rank FROM employees ) SELECT employee_id, salary, department_id, salary_rank FROM EmployeesSalaryRank ORDER BY department_id, salary_rank; */ /* Описание задачи: Используя ту же таблицу employees, напиши запрос, который выведет: employee_id, salary, Скользящее среднее зарплаты за последние 3 сотрудника (используй оконную функцию AVG() с ROWS BETWEEN). CREATE TABLE employees ( employee_id INT, salary NUMERIC, department_id INT ); INSERT INTO employees (employee_id, salary, department_id) VALUES (1, 50000, 101), (2, 60000, 102), (3, 55000, 101), (4, 70000, 103), (5, 65000, 102), (6, 48000, 103), (7, 72000, 101), (8, 53000, 104), (9, 62000, 105), (10, 58000, 101); WITH EmployeesSalaryAVG as ( SELECT department_id, employee_id, salary, AVG(salary) OVER ( PARTITION BY department_id ORDER BY employee_id ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING ) as salary_move_avg FROM employees ) SELECT department_id, employee_id, salary, salary_move_avg FROM EmployeesSalaryAVG ORDER BY department_id, employee_id; */ /* Задание 3: Поиск сотрудников с максимальной зарплатой в каждом отделе Описание задачи: Используя таблицу employees, напиши запрос, который выведет: department_id, employee_id, salary, Признак того, что зарплата сотрудника является максимальной в его отделе (используй оконную функцию MAX() и CTE). Ожидаемый результат: department_id employee_id salary is_max_salary 101 7 72000 true 102 5 65000 true 103 4 70000 true 104 8 53000 true 105 9 62000 true CREATE TABLE employees ( employee_id INT, salary NUMERIC, department_id INT ); INSERT INTO employees (employee_id, salary, department_id) VALUES (1, 50000, 101), (2, 60000, 102), (3, 55000, 101), (4, 70000, 103), (5, 65000, 102), (6, 48000, 103), (7, 72000, 101), (8, 53000, 104), (9, 62000, 105), (10, 58000, 101), (11, 72000, 101); WITH EmployeesSalaryMAX as ( SELECT department_id, employee_id, salary, MAX(salary) OVER ( PARTITION BY department_id ) as salary_max FROM employees ) SELECT department_id, employee_id, salary, (salary = salary_max) as salary_is_max FROM EmployeesSalaryMAX WHERE salary = salary_max ORDER BY department_id, employee_id; */ /* Задание 4: Разница между зарплатой сотрудника и средней зарплатой в отделе Описание задачи: Используя таблицу employees, напиши запрос, который выведет: employee_id, salary, Разницу между зарплатой сотрудника и средней зарплатой в его отделе (используй оконную функцию AVG() и CTE). Ожидаемый результат: employee_id salary salary_diff 1 50000 -8750.0 2 60000 -2500.0 3 55000 -3750.0 4 70000 11000.0 5 65000 2500.0 6 48000 -11000.0 7 72000 13250.0 8 53000 0.0 9 62000 0.0 10 58000 -750.0 */ CREATE TABLE employees ( employee_id INT, salary NUMERIC, department_id INT ); INSERT INTO employees (employee_id, salary, department_id) VALUES (1, 50000, 101), (2, 60000, 102), (3, 55000, 101), (4, 70000, 103), (5, 65000, 102), (6, 48000, 103), (7, 72000, 101), (8, 53000, 104), (9, 62000, 105), (10, 58000, 101), (11, 72000, 101); WITH EmployeesSalaryAVG as ( SELECT department_id, employee_id, salary, AVG(salary) OVER ( PARTITION BY department_id ) as salary_avg FROM employees ) SELECT department_id, employee_id, salary, ROUND(salary - salary_avg, 0) as salary_dif FROM EmployeesSalaryAVG ORDER BY department_id, employee_id;

Stuck with a problem? Got Error? Ask ChatGPT!

Copy Clear