Find the 3 Largest Jumps Between Adjacent Salaries
Sort salaries, compare each with the next lower one, and return the three biggest differences.
The challenge runs on the SQLabHub practice database (SQLite) and uses the employees table. You can solve it in the browser, with nothing to install.
The task
Find employees with largest salary difference compared to previous.
A correct answer returns 3 rows with 3 columns: id, salary, diff.
Tables used in this challenge
employees 120 rows
id INTEGER (PK) · first_name TEXT · last_name TEXT · email TEXT · department TEXT · department_id INTEGER · title TEXT · salary REAL · hire_date TEXT · manager_id INTEGER · city TEXT · status TEXT
| id | first_name | last_name | department | department_id | title | salary | hire_date | manager_id | city | status | |
|---|---|---|---|---|---|---|---|---|---|---|---|
The first rows of each table are shown. See how all the tables relate on the database schema page.
Expected output
| id | salary | diff |
|---|---|---|
The complete result: 3 rows. This is the output of the model solution on the practice database.
What you practise
- Reading the previous row's value with LAG()
- Sorting the result with ORDER BY
- Returning only the first rows with LIMIT
- Deriving a new column from an expression and naming it with an alias
Hint and approach
Try the challenge first. Open these only when you need them.
Show the hint
LAG salary
Show the step-by-step approach
How the model solution is built, in the order the database evaluates it:
- Read from the
employeestable. - Fetch
salaryfrom the previous row withLAG(), ordered bysalary. Where there is no such row the value is NULL. - Combine those values into
diff:salary - LAG(salary) OVER (ORDER BY salary). - Sort the result by
diffdescending. - Keep only the first 3 rows with
LIMIT.
Model solution
Checking your session…
What to watch for
The window is ordered by salary itself, so LAG() returns the next lower salary and the difference is the gap to that neighbour. The outer ORDER BY then sorts by the gap, which is a different order from the one inside OVER.
- LAG(). LAG() returns NULL for the first row of each partition, and any arithmetic with that NULL is NULL too. Supply a default as the third argument if you need a number.
- Calculated columns. Dividing one integer by another truncates the result in SQLite. Multiply one side by 1.0 to get decimals.
- LIMIT. LIMIT without ORDER BY returns an arbitrary set of rows. LIMIT is also dialect-specific: SQL Server uses TOP and Oracle uses FETCH FIRST.
Related SQL challenges
- Calculate the Difference from the Previous Order with LAG()Similar levelHard
- Find the Longest Gap Between Consecutive HiresSimilar levelHard
- Find the Top 5 Customers by Total SpendEasierMedium
- Calculate the Day-to-Day Change in RevenueSimilar levelHard
- Calculate Day-over-Day Revenue Growth in PercentSimilar levelHard
Keep learning
- Lesson: LAG & LEAD
- Lesson: Comments & Aliases
- Lesson: LIMIT / TOP / FETCH
- Lesson: ORDER BY
- All SQL practice challenges, by difficulty and topic
- SQL interview questions with answers
- SQL Playground: run any query on the same database