- Assign row numbers to employees
SELECT emp_name, ROW_NUMBER() OVER (ORDER BY salary DESC) rn
FROM Employee;
- Rank employees by salary
SELECT emp_name, RANK() OVER (ORDER BY salary DESC) rnk
FROM Employee;
- Dense rank employees by salary
SELECT emp_name, DENSE_RANK() OVER (ORDER BY salary DESC) drnk
FROM Employee;
- Find top 3 salaries
SELECT *
FROM (
SELECT *, DENSE_RANK() OVER (ORDER BY salary DESC) drnk
FROM Employee
) x
WHERE drnk <= 3;
- Find top 3 salaries in each department
SELECT *
FROM (
SELECT *, DENSE_RANK() OVER (PARTITION BY dept_id
ORDER BY salary DESC) drnk
FROM Employee
) x
WHERE drnk <= 3;
- Find highest salary in each department
SELECT *
FROM (
SELECT *, RANK() OVER (PARTITION BY dept_id
ORDER BY salary DESC) rnk
FROM Employee
) x
WHERE rnk = 1;
- Calculate running salary total
SELECT emp_name, salary,
SUM(salary) OVER (ORDER BY emp_id) running_total
FROM Employee;
- Calculate cumulative sales
SELECT month, sales,
SUM(sales) OVER (ORDER BY month) cumulative_sales
FROM Sales;
- Get previous salary value
SELECT emp_name, salary,
LAG(salary) OVER (ORDER BY emp_id) prev_salary
FROM Employee;
- Get next salary value
SELECT emp_name, salary,
LEAD(salary) OVER (ORDER BY emp_id) next_salary
FROM Employee;
- Compare current and previous month sales
SELECT month, sales,
LAG(sales) OVER (ORDER BY month) prev_month_sales
FROM Sales;
- Find salary difference from previous employee
SELECT emp_name, salary,
salary - LAG(salary) OVER (ORDER BY emp_id) diff
FROM Employee;
- Find first salary in each department
SELECT *,
FIRST_VALUE(salary) OVER (PARTITION
BY dept_id ORDER BY salary DESC)
FROM Employee;
- Find last salary in each department
SELECT *,
LAST_VALUE(salary) OVER (PARTITION BY
dept_id ORDER BY salary DESC)
FROM Employee;
- Find average salary by department without grouping
SELECT emp_name, dept_id,
AVG(salary) OVER (PARTITION BY dept_id) avg_salary
FROM Employee;
- Find percent contribution of salary
SELECT emp_name, salary,
salary * 100.0 / SUM(salary) OVER() pct
FROM Employee;
- Find duplicate rows using row_number
SELECT *
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION
BY emp_name ORDER BY emp_id) rn
FROM Employee
) x
WHERE rn > 1;
-
Delete duplicate rows
Use above query in CTE and delete wherern > 1. - Find latest order per customer
SELECT *
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY
customer_id ORDER BY order_date DESC) rn
FROM Orders
) x
WHERE rn = 1;
- Find first order per customer
SELECT *
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY
customer_id ORDER BY order_date ASC) rn
FROM Orders
) x
WHERE rn = 1;
Top SQL Queries for Practice (With Short Answers) - Window Function Queries (61–80)
ReplyDelete