De afgelopen 6 jaar heb ik deelgenomen aan veel sollicitatiegesprekken – aan beide kanten van de tafel. Het leukste, maar ook het meest gevreesde deel van het proces is de technische screening. In dit artikel laat ik je drie SQL test oefeningen zien die, in mijn ervaring, vrij typisch zijn in data analist sollicitatiegesprekken. (En hé, dit zijn “voorbeeld” SQL-interviewvragen, maar ze zijn zwaar gebaseerd op de werkelijkheid!)
Voor de taken – Wat kun je verwachten bij een SQL-technische screening?
Er zijn twee veel voorkomende manieren waarop een SQL-technische screening kan worden uitgevoerd.
De eenvoudigste, maar minder gebruikelijke manier is dat je een computer, een dataset en een taak krijgt. Terwijl u de taak oplost, kijken de interviewers toe en stellen vragen. Een beetje trial and error is helemaal prima, zolang je maar binnen een redelijke tijd met de juiste oplossing komt.
De andere, moeilijkere (en overigens veel gangbaardere) manier is het whiteboard interview. In dit geval krijg je geen computer. Je moet de opdracht oplossen en de code op een whiteboard schetsen. Dit betekent dat je geen feedback krijgt (althans niet van een computer) over of je een logische of een syntaxisfout in je code hebt gemaakt. Natuurlijk kun je de opgaven nog steeds oplossen door iteratief te denken (door de verschillende SQL-problemen een voor een op te lossen), maar dan moet je wel heel zeker zijn van je SQL-vaardigheden.
Daarnaast moet je de opgaven meestal ‘on the fly’ oplossen. Misschien krijg je 3-5 minuten bedenktijd, maar dat is het maximum dat je kunt verwachten. Het goede nieuws is dat je daardoor relatief eenvoudigere opgaven krijgt. (Zie de moeilijkheidsgraad hieronder!)
Note: er zijn andere soorten technische screening – zoals de take-home opdracht – waar je kunt bewijzen dat je ook complexere coderingsuitdagingen kunt oplossen.
Test jezelf!
Hier zijn drie SQL-interviewvragen die heel dicht in de buurt komen van wat ik echt heb gekregen of gegeven op data-analist/wetenschapper sollicitatiegesprekken.
Probeer ze allemaal op te lossen alsof het whiteboard-interviews zijn.
In de tweede helft van het artikel laat ik je ook de oplossingen zien.
SQL-interviewvraag #1
Let’s say you have two SQL tables: authors
en books
.
De authors
dataset heeft meer dan 1M rijen; hier zijn de eerste zes rijen:
auteur_naam | boek_naam |
auteur_1 | boek_1 |
auteur_1 | boek_2 |
auteur_2 | boek_3 |
auteur_2 | boek_4 |
auteur_2 | boek_5 |
auteur_3 | boek_6 |
… | … |
De books
dataset heeft ook 1M+ rijen en hier zijn de eerste zes:
book_name | sold_copies |
book_1 | 1000 |
book_2 | 1500 |
book_3 | 34000 |
boek_4 | 29000 |
boek_5 | 40000 |
boek_6 | 4400 |
… | … |
Maak een SQL query die de TOP 3 auteurs laat zien die in totaal de meeste boeken hebben verkocht!
(Opmerking: ik kreeg een zeer, zeer vergelijkbare SQL-gespreksvraag voor een positie als data scientist bij een zeer bekend Zweeds IT-bedrijf.)
SQL-gespreksvraag #2
Je werkt voor een startup die een online presentatiesoftware maakt. U hebt een gebeurtenislogboek dat elke keer dat een gebruiker een afbeelding in een presentatie invoegt, registreert. (Een gebruiker kan meerdere afbeeldingen invoegen.) De event_log
SQL tabel ziet er als volgt uit:
user_id | event_date_time |
7494212 | 1535308430 |
7494212 | 1535308433 |
1475185 | 1535308444 |
6946725 | 1535308475 |
6946725 | 1535308476 |
6946725 | 1535308477 |
… | … |
…en het heeft meer dan een miljard rijen.
Note: als het formaat van de kolom event_date_time
je niet bekend voorkomt, google dan eens op “epoch timestamp”!
Schrijf een SQL query om uit te vinden hoeveel gebruikers meer dan 1000 maar minder dan 2000 afbeeldingen in hun presentaties hebben opgenomen!
(Opmerking: ik heb deze vraag zelf gemaakt en gebruikt om data-analisten te testen toen ik nog freelancer was en mijn klanten hulp nodig hadden bij hun wervingsproces.)
SQL Interview Vraag #3
Je hebt twee SQL tabellen! De eerste heet employees
en bevat de namen van de werknemers, de unieke werknemers-id’s en de afdelingsnamen van een bedrijf. Voorbeeld:
department_name | employee_id | employee_name |
Sales | 123 | John Doe |
Sales | 211 | Jane Smith |
HR | 556 | Billy Bob |
Sales | 711 | Robert Hayek |
Marketing | 235 | Edward Jorgson |
Marketing | 236 | Christine Packard |
… | … | … |
De tweede heet salaries
. Het bevat dezelfde werknemersnamen en dezelfde werknemers-id’s – en de salarissen voor elke werknemer. Voorbeeld:
salaris | werknemer_id | werknemer_naam |
500 | 123 | John Doe |
600 | 211 | Jane Smith |
1000 | 556 | Billy Bob |
400 | 711 | Robert Hayek |
1200 | 235 | Edward Jorgson |
200 | 236 | Christine Packard |
… | … | … |
Het bedrijf heeft 546 werknemers, dus beide tabellen hebben 546 rijen.
Print elke afdeling waar het gemiddelde salaris per werknemer lager is dan $500!
(Opmerking: ik heb deze testvraag gemaakt op basis van een echte SQL-gespreksvraag die ik hoorde van een vriend, die solliciteerde bij een van de grootste sociale-mediabedrijven (naam begint met ‘F.’ :))
Oplossing van SQL Interview Vraag #1
De oplossingscode is:
SELECT authors.author_name, SUM(books.sold_copies) AS sold_sumFROM authorsJOIN booksON books.book_name = authors.book_nameGROUP BY authors.author_nameORDER BY sold_sum DESCLIMIT 3;
En hier is een korte uitleg:
1. Eerst moet je de JOIN
starten. Ik heb de twee tabellen samengevoegd door gebruik te maken van:
SELECT *FROM authorsJOIN booksON books.book_name = authors.book_name;
2. Daarna heb ik een SUM()
functie gebruikt met een GROUP BY
clausule. Dit betekent dat ik in het SELECT
statement de *
moest vervangen door de author_name
en sold_copies
kolommen. (Het is niet verplicht om aan te geven uit welke tabel je de kolommen selecteert, maar het is wel de moeite waard. Daarom heb ik authors.author_name
en books.sold_copies
gebruikt.)
3. Uiteindelijk heb ik ORDER
de resultaten in DESC
eindigende volgorde gezet. (Voor het gemak heb ik ook de sum
kolom hernoemd naar sold_sum
met behulp van de AS sold_sum
methode in het SELECT
statement.)
Oplossing van SQL Interview Vraag #2
De SQL query is:
SELECT COUNT(*) FROM (SELECT user_id, COUNT(event_date_time) AS image_per_user FROM event_log GROUP BY user_id) AS image_per_userWHERE image_per_user < 2000 AND image_per_user > 1000;
De truc in deze opgave is dat je de COUNT()
functie twee keer moest gebruiken: eerst moest je het aantal afbeeldingen per gebruiker tellen, daarna het aantal gebruikers (dat aan de gegeven voorwaarde voldoet). De eenvoudigste manier om dat te doen is door een subquery te gebruiken.
- Schrijf eerst de binnenste query! Voer een eenvoudige
COUNT()
functie uit met eenGROUP BY
clausule op deevent_log
tabel. - Zorg ervoor dat u een alias maakt voor de subquery (
AS image_per_user
). Het is een syntaxis vereiste in SQL. - Eventueel, in een outer query, pas een
WHERE
filter en eenCOUNT()
functie toe op het resultaat van de subquery.
Oplossing van SQL Interview Vraag #3
Oplossing:
SELECT department_name, AVG(salaries.salary) AS avg_salariesFROM employeesJOIN salariesON employees.employee_id = salaries.employee_idGROUP BY department_nameHAVING AVG(salaries.salary) < 500;
Note: U kunt deze opgave ook oplossen met behulp van een subquery – maar in een interview situatie zal de commissie de bovenstaande oplossing beter vinden.
Korte uitleg:
1. Koppel eerst de twee tabellen:
SELECT *FROM employeesJOIN salariesON employees.employee_id = salaries.employee_id
Let op! Gebruik de kolom employee_id
– niet de kolom employee_name
. (U kunt altijd twee John Does bij een bedrijf hebben, maar de werknemer-id is uniek!)
2. Gebruik vervolgens een AVG()
-functie met een GROUP BY
-clausule – en vervang de *
door de juiste kolommen. (Net als in de eerste opgave.)
3. En de laatste stap is het gebruik van een HAVING
clausule om te filteren op het resultaat van de AVG()
functie. (Denk eraan: WHERE
is hier niet goed, omdat het zou worden geïnitieerd vóór de AVG()
functie.)
Waarschuwing: in de HAVING
regel, kun je niet verwijzen naar de alias – je moet de hele functie zelf weer gebruiken!
Vereid je voor op SQL tech screenings door te oefenen!
Als het je gelukt is om al deze vragen goed op te lossen, ben je waarschijnlijk klaar voor een junior of zelfs voor een mid-level Data Analist SQL technische screening.
Zo niet, laat me je dan mijn nieuwe online cursus aanraden: SQL for Aspiring Data Scientists (7-daagse online cursus) – waar je in slechts 7 dagen je SQL-vaardigheden op een hoger niveau kunt brengen (of bijspijkeren). Als je klaar bent met de cursus, kom je gewoon terug naar dit artikel en ik garandeer je dat je deze vragen zult kunnen oplossen!
SQL for Aspiring Data Scientists (7-daagse online cursus)
En als je net begint met SQL, begin dan met mijn SQL For Data Analysis-serie op de blog!
Conclusie
Het lastige van deze SQL-interviewvragen is dat ze abstract zijn. De opgaven zeggen dat je “je de datasets moet voorstellen” en er slechts een paar regels van moet laten zien. Als je zo’n oefening krijgt, helpt het enorm als je soortgelijke datasets hebt gezien en soortgelijke problemen eerder hebt opgelost. Ik hoop dat het oplossen van de opgaven in dit artikel je zelfvertrouwen zal doen toenemen!