ExpertCTEs & Recursion50 points

Quarter by quarter: how fast is Nordvik growing?

The board wants a growth chart for 2024 Q3 to 2026 Q2 (eight quarters). No calendar table exists, so you must generate the quarters yourself with a recursive CTE. For each quarter we need people who joined, people who left and the headcount on the last day of the quarter: employees hired on or before that day who had not left by then (a leaver whose termination_date is after the quarter end still counts as employed at quarter end).

Task: return quarter (text like 2025-Q1), hires (hire_date inside the quarter), leavers (termination_date inside the quarter), headcount (as defined above) and growth_pct (percentage change of headcount versus the previous quarter, ROUND(x, 2), NULL for the first quarter). Sort by quarter ascending.

The data you can query

Each table is shown with its column types and the first rows, so you can see exactly what the data looks like.

departments7 rows
dept_id INTEGERname TEXT
1Engineering
2Sales
3Finance
4People & Culture
5Marketing
6Operations

Showing the first 6 of 7 rows.

employees58 rows
emp_id INTEGERname TEXTdept_id INTEGERjob_title TEXTcountry TEXTgrade INTEGERsalary_usd INTEGERhire_date TEXTtermination_date TEXTmanager_id INTEGER
1Harry Clarke7Chief Executive OfficerUnited Kingdom93750002016-03-01NULLNULL
2Khalid Al Hashimi1VP of EngineeringUnited Arab Emirates82370002021-03-01NULL1
3Zainab Ahmed1Director of Engineering 1Pakistan7590002021-10-12NULL2
4Hina Khan1Engineering ManagerPakistan6400002024-08-10NULL3
5Ren Tanaka1QA EngineerJapan4680002022-12-19NULL4
6Piotr Zielinski1Data EngineerPoland3330002025-10-23NULL4

Showing the first 6 of 58 rows.

performance_reviews178 rows
review_id INTEGERemp_id INTEGERreview_period TEXTrating INTEGERreviewed_on TEXT
122024-H222024-12-20
222025-H112025-06-18
322025-H232025-12-30
422026-H122026-06-25
532024-H232024-12-29
632025-H142025-06-18

Showing the first 6 of 178 rows.

promotions9 rows
promo_id INTEGERemp_id INTEGERpromo_date TEXTold_grade INTEGERnew_grade INTEGERold_salary_usd INTEGERnew_salary_usd INTEGER
132025-11-26675000059000
242025-12-10563300040000
362026-05-08232800033000
472025-09-1467120000143000
5122025-01-06232700029000
6292026-02-23678000091000

Showing the first 6 of 9 rows.

Your query runs on SQLite. Write a single SELECT; use LIMIT instead of TOP.

Need a hint?

Date arithmetic with date(x, '+3 months') walks the quarters. LAG() gives the previous quarter's headcount on the same row.