Au cours des 6 dernières années, j’ai participé à de nombreux entretiens d’embauche – des deux côtés de la table. La partie la plus amusante, mais aussi la plus redoutée, du processus est la sélection technique. Dans cet article, je vais vous montrer trois exercices de test SQL qui, d’après mon expérience, sont assez typiques des entretiens d’embauche des analystes de données. (Et hé, ce sont des » exemples » de questions d’entretien SQL, mais elles sont fortement basées sur la réalité !)
Avant les tâches – À quoi pouvez-vous vous attendre lors d’un dépistage technique SQL ?
Il y a deux façons courantes de procéder à un dépistage technique SQL.
La façon la plus simple mais la moins courante est que vous obtenez un ordinateur, un ensemble de données et une tâche. Pendant que vous résolvez la tâche, les interviewers observent et posent des questions. Un peu d’essai et d’erreur est tout à fait correct, tant que vous parvenez à trouver la bonne solution dans un délai raisonnable.
L’autre façon, plus difficile (et d’ailleurs beaucoup plus courante) est l’entretien sur tableau blanc. Dans ce cas, vous n’avez pas d’ordinateur. Vous devez résoudre la tâche et esquisser le code sur un tableau blanc. Cela signifie que vous n’obtiendrez pas de retour (du moins pas d’un ordinateur) pour savoir si vous avez commis une erreur de logique ou de syntaxe dans votre code. Bien sûr, vous pouvez toujours résoudre les tâches en réfléchissant de manière itérative (en résolvant les différents problèmes SQL un par un), mais vous devez être très confiant dans vos compétences SQL.
En outre, vous devez généralement résoudre les tâches à la volée. Vous aurez peut-être 3 à 5 minutes de temps de réflexion, mais c’est le maximum que vous pouvez espérer. La bonne nouvelle est qu’à cause de cela, vous obtiendrez des tâches relativement plus simples. (Voir le niveau de difficulté ci-dessous !)
Note : il existe d’autres types de dépistage technologique – comme le devoir à emporter – où vous pouvez prouver que vous pouvez résoudre des défis de codage plus complexes, aussi.
Testez-vous !
Voici trois questions d’entretien SQL qui sont vraiment proches de ce que j’ai réellement obtenu ou donné lors d’entretiens d’embauche d’analystes de données/scientifiques !
Essayez de les résoudre toutes comme s’il s’agissait d’entretiens sur tableau blanc !
Dans la deuxième moitié de l’article, je vous montrerai les solutions, aussi !
Question d’entretien SQL #1
Disons que vous avez deux tables SQL : authors
et books
.
Le jeu de données authors
a 1M+ rangs ; voici les six premiers rangs :
nom de l’auteur | nom du livre |
auteur_1 | livre_1 |
auteur_1 | livre_2 |
auteur_2 | livre_3 |
auteur_2 | livre_4 |
auteur_2 | livre_5 |
auteur_3 | livre_6 |
… | … |
L’ensemble de données books
a également 1M+ lignes et voici les six premières :
nom du livre | copies vendues |
livre_1 | 1000 |
livre_2 | 1500 |
livre_3 | 34000 |
book_4 | 29000 |
book_5 | 40000 |
book_6 | 4400 |
… | … |
Créer une requête SQL qui montre le TOP 3 des auteurs qui ont vendu le plus de livres au total !
(Note : j’ai reçu une question d’entretien SQL très, très similaire pour un poste de data scientist dans une entreprise informatique suédoise très connue.)
Question d’entretien SQL n°2
Vous travaillez pour une startup qui fabrique un logiciel de présentation en ligne. Vous avez un journal des événements qui enregistre chaque fois qu’un utilisateur a inséré une image dans une présentation. (Un utilisateur peut insérer plusieurs images.) La table SQL event_log
ressemble à ceci :
user_id | event_date_time |
7494212 | 1535308430 |
7494212 | 1535308433 |
1475185 | 1535308444 |
6946725 | 1535308475 |
6946725 | 1535308476 |
6946725 | 1535308477 |
… | … |
…et il a plus d’un milliard de lignes.
Note : Si le format de la colonne event_date_time
ne vous semble pas familier, googlez « epoch timestamp » !
Ecrivez une requête SQL pour savoir combien d’utilisateurs ont inséré plus de 1000 mais moins de 2000 images dans leurs présentations !
(Remarque : j’ai personnellement créé et utilisé cette question d’entretien pour tester les analystes de données lorsque je travaillais en freelance et que mes clients avaient besoin d’aide dans leur processus d’embauche.)
Question d’entretien SQL n°3
Vous avez deux tables SQL ! La première s’appelle employees
et elle contient les noms des employés, les identifiants uniques des employés et les noms des départements d’une entreprise. Exemple :
nom du département | id de l’employé | nom de l’employé |
Ventes | 123 | John Doe |
Sales | 211 | Jane Smith |
HR | 556 | Billy Bob |
Ventes | 711 | Robert Hayek |
Marketing | 235 | Edward Jorgson |
Marketing | 236 | Christine Packard |
… | … | … |
La seconde est nommée salaries
. Il contient les mêmes noms d’employés et les mêmes identifiants d’employés – et les salaires de chaque employé. Exemple :
salaire | id_employé | nom_employé |
500 | 123 | John Doe |
600 | 211 | Jane Smith |
1000 | 556 | Billy Bob |
400 | 711 | Robert Hayek |
1200 | 235 | Edward Jorgson |
200 | 236 | Christine Packard |
… | … | … |
La société a 546 employés, donc les deux tables ont 546 lignes.
Imprimez chaque département où le salaire moyen par employé est inférieur à 500 $ !
(Remarque : j’ai créé cette question de test en me basant sur une vraie question d’entretien SQL que j’ai entendue d’un ami, qui a postulé dans l’une des plus grandes entreprises de médias sociaux (le nom commence par ‘F.’ :))
Solution de la question d’entretien SQL #1
Le code de la solution est :
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;
Et voici une courte explication :
1. Vous devez d’abord initier le JOIN
. J’ai joint les deux tables en utilisant :
SELECT *FROM authorsJOIN booksON books.book_name = authors.book_name;
2. Après cela, j’ai utilisé une fonction SUM()
avec une clause GROUP BY
. Cela signifie que dans l’instruction SELECT
, j’ai dû remplacer les *
par les colonnes author_name
et sold_copies
. (Il n’est pas obligatoire d’indiquer à partir de quelle table vous sélectionnez les colonnes, mais cela en vaut la peine. C’est pourquoi j’ai utilisé authors.author_name
et books.sold_copies
.)
3. Finalement, j’ai ORDER
mis les résultats dans un ordre DESC
terminant. (Juste pour ma commodité, j’ai également renommé la colonne sum
en sold_sum
en utilisant la méthode AS sold_sum
dans l’instruction SELECT
.)
Solution de la question d’entretien SQL n°2
La requête SQL est :
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;
L’astuce dans cette tâche est que vous avez dû utiliser la fonction COUNT()
deux fois : d’abord, vous avez dû compter le nombre d’images par utilisateur, puis le nombre d’utilisateurs (qui remplissent la condition donnée). La façon la plus simple de le faire est d’utiliser une sous-requête.
- Écrivez d’abord la requête interne ! Exécutez une simple fonction
COUNT()
avec une clauseGROUP BY
sur la tableevent_log
. - Assurez-vous de créer un alias pour la sous-requête (
AS image_per_user
). C’est une exigence syntaxique en SQL. - Éventuellement, dans une requête externe, appliquez un filtre
WHERE
et une fonctionCOUNT()
sur le résultat de la sous-requête.
Solution de la question d’entretien SQL n°3
Solution:
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 : vous pouvez aussi résoudre cette tâche en utilisant une sous-requête – mais en situation d’entretien, le comité préférera la solution ci-dessus.
Explication succincte:
1. D’abord JOINDRE les deux tables:
SELECT *FROM employeesJOIN salariesON employees.employee_id = salaries.employee_id
Attention ! Utilisez la colonne employee_id
– pas la employee_name
. (Vous pouvez toujours avoir deux John Does dans une entreprise, mais l’id de l’employé est unique !)
2. Utilisez ensuite une fonction AVG()
avec une clause GROUP BY
– et remplacez les *
par les colonnes appropriées. (Tout comme dans la première tâche.)
3. Et la dernière étape consiste à utiliser une clause HAVING
pour filtrer par le résultat de la fonction AVG()
. (Rappelez-vous : WHERE
n’est pas bon ici parce qu’il serait initié avant la fonction AVG()
.)
Attention : dans la ligne HAVING
, vous ne pouvez pas faire référence à l’alias – vous devez utiliser à nouveau la fonction entière elle-même !
Préparez-vous aux examens techniques SQL en vous exerçant !
Si vous avez réussi à résoudre correctement toutes ces questions, vous êtes probablement prêt pour un dépistage technique SQL d’analyste de données junior ou même de niveau intermédiaire.
Sinon, laissez-moi vous recommander mon nouveau cours en ligne : SQL for Aspiring Data Scientists (cours en ligne de 7 jours) – où vous pouvez mettre à niveau (ou rafraîchir) vos compétences SQL en seulement 7 jours. Lorsque vous aurez terminé le cours, revenez simplement à cet article et je vous garantis que vous serez en mesure de résoudre ces questions!
SQL for Aspiring Data Scientists (7-day online course)
Et si vous êtes sur le point de commencer avec SQL, commencez par ma série SQL For Data Analysis sur le blog!
Conclusion
La partie difficile de ces questions d’entretien SQL est qu’elles sont abstraites. Les tâches disent d' »imaginer les ensembles de données » et n’en montrent que quelques lignes. Lorsque vous obtenez un exercice comme celui-ci, il est très utile d’avoir vu des ensembles de données similaires et d’avoir résolu des problèmes similaires auparavant. J’espère que la résolution des tâches de cet article renforcera votre confiance!