Reviewed by Aditya Kumar · Last reviewed 2026-08-08
Rank within each department, then filter to N. PARTITION BY restarts the numbering per department, so one query answers it for every department at once. Parameterise it safely The natural follow up is…
This medium-level SQL question appears frequently in data engineering interviews at companies like Walmart. While less common, it tests deeper understanding that distinguishes strong candidates. Mastering the underlying concepts (partition) will help you answer variations of this question confidently.
Break this problem into components. Identify the core trade-offs involved, then walk the interviewer through your reasoning step by step. Demonstrate awareness of edge cases and production considerations - this is what separates good answers from great ones. The expert answer includes a code example that demonstrates the implementation pattern.
Rank within each department, then filter to N. PARTITION BY restarts the numbering per department, so one query answers it for every department at once.
SELECT department, employee_id, salary
FROM (
SELECT employee_id,
department,
salary,
DENSE_RANK() OVER (PARTITION BY department
ORDER BY salary DESC) AS rk
FROM employees
) ranked
WHERE rk = :n;
The natural follow-up is "now make N configurable". Pass it as a bind parameter, as above, rather than concatenating it into the SQL string. String-building a query from user input is a SQL injection hole, and it also defeats plan caching because every value of N produces a textually different statement. A bind parameter reuses one cached plan.
DENSE_RANK treats tied salaries as one rank and skips nothing, so N means "the Nth distinct salary" — usually the intended reading. RANK skips ranks after a tie, so rank N may not exist and the query can return nothing. ROW_NUMBER never ties but picks arbitrarily between equal salaries, so results are not reproducible unless you add a deterministic tiebreaker such as ORDER BY salary DESC, employee_id.
The classic pre-window approach counts distinct higher salaries per row. It is correlated, so it re-scans the department for every row and degrades quadratically. The window version sorts once per partition and streams through. On any realistic table the difference is large, and knowing why is the point of the question.
A composite index on (department, salary DESC) supplies rows in partition and sort order, letting the engine skip the sort. Departments with fewer than N distinct salaries return no row, which is correct but worth stating. If callers need every department represented, LEFT JOIN the ranked set back onto the department list.
In the interview, also mention that TOP N per group is the same pattern with rk <= :n.
Red Flag: N=1 with ROW_NUMBER—use MAX or FIRST. Pro-Move: 'We used a config table for N per report—top 3 for exec, top 10 for manager dashboard.'
Some links below are affiliate links. If you buy through them we may earn a small commission at no extra cost to you — it helps keep DataEngPrep free.
According to DataEngPrep.tech, this is one of the most frequently asked SQL interview questions, reported at 1 company. DataEngPrep.tech maintains an editor-reviewed database of 1,863 data engineering interview questions across 7 categories.