Analyse de la fréquentation des clubs de fitness Vous travaillez en tant qu’analyste dans une chaîne de clubs de fitness. Vous disposez d’informations sur les visites des utilisateurs et les abonnements qu’ils achètent. Il est nécessaire d’analyser l’efficacité de l’utilisation des abonnements. Calculez pour chaque type d’abonnement : • le nombre total d’utilisateurs ayant utilisé ce type d’abonnement. Ne considérez que les user_id uniques; • le nombre total de visites pour cet abonnement. Considérez toutes les visites des utilisateurs avec cet abonnement; • la part des utilisateurs de cet abonnement en pourcentage du nombre total d’utilisateurs (arrondi à un chiffre après la virgule). Pour calculer la part, utilisez le rapport entre le nombre d’utilisateurs avec cet abonnement et le nombre total d’utilisateurs uniques. Chaque utilisateur ne peut avoir qu’un seul abonnement. Triez le résultat par type d’abonnement par ordre alphabétique. Format d’entrée Table memberships : • membership_id (int) — identifiant unique de l’abonnement • user_id (int) — identifiant unique de l’utilisateur • membership_type (text) — type d’abonnement Table visits : • visit_id (int) — identifiant unique de la visite • user_id (int) — identifiant de l’utilisateur • visit_date (timestamp) — date et heure de la visite Les données ne contiennent pas de valeurs manquantes ou incorrectes. Format de sortie La requête doit retourner une table avec les champs dans cet ordre : • membership_type (text) — type d’abonnement • users_count (int) — nombre d’utilisateurs uniques avec ce type d’abonnement • total_visits (int) — nombre total de visites des utilisateurs avec cet abonnement • user_share (numeric) — part des utilisateurs en pourcentage avec cet abonnement par rapport au total (arrondi à 1 décimale) Le résultat est trié par type d’abonnement par ordre alphabétique.
Data Engineer
Connaissez-vous la méthodologie Domain Driven Design (DDD) ? Si oui, partagez des exemples de son application dans vos projets.
Comment supprimer un sous-module et ses fichiers associés du projet? git submodule remove <chemin-vers-sous-module> git rm --cached <chemin-vers-sous-module>; supprimer la section de .gitmodules; git commit git clean --submodules <chemin> git submodule delete <chemin> git remove submodule <chemin>
Dans le processus de travail avec git bisect, vous avez rencontré un commit qui ne peut pas être vérifié en raison de l'absence de l'environnement nécessaire. Que faut-il faire dans cette situation ? - Recommencer la commande git bisect start avec d'autres hachages - Passer ce commit avec la commande git bisect skip - Réinitialiser bisect avec la commande git bisect reset - Marquer le commit comme bon avec la commande git bisect good - Marquer le commit comme mauvais avec la commande git bisect bad
Quelle expression à la place de [...] entraînera automatiquement la création d'un index? Il y a un défilement horizontal du code sur la plateforme mobile create table some_table( col_name [...] ); unique references other_table(col_name) not null serial integer check (col_name > 0)
Pourquoi la requête suivante n'utilisera pas l'index si un index B-tree normal a été créé sur id dans la table records? select * from records where id % 2 = 0 - Pour id, un index de type GIN est nécessaire - Les index ne fonctionnent pas avec des expressions dans WHERE - % est une opération de comparaison, pas de filtrage - limit et offset sont obligatoires pour l'optimisation avec index - La requête accède à un champ numérique, pas à une chaîne de caractères
Expliquez comment fonctionne techniquement Git LFS et quels avantages il offre par rapport à Git standard lors du travail avec de gros fichiers.
Rapport pour l'entreprise logistique Vous êtes analyste dans une entreprise logistique qui enregistre les opérations dans les entrepôts. Vous devez établir un rapport sur l'efficacité de chaque entrepôt. Pour chaque entrepôt, calculez : • le nombre total d'opérations (count_operations); • le nombre total de produits traités dans l'entrepôt (sum_quantity); • le temps moyen de traitement d'une opération (avg_processing_time), en ne considérant que les opérations avec un temps spécifié (non NULL), arrondi à l'entier le plus proche; • le nombre maximum et minimum de produits traités en une seule opération (max_quantity, min_quantity); • le nombre d'opérations de chaque type (« livraison », « expédition », « transfert ») dans des colonnes séparées : supply_operations, shipment_operations, transfer_operations. Filtrez les entrepôts dont le nombre total d'opérations est supérieur à 2 et dont le temps moyen de traitement ne dépasse pas 60 minutes. Triez le résultat par ID d'entrepôt par ordre croissant. Format d'entrée Table operations: • operation_id (int) — identifiant unique de l'opération • warehouse_id (int) — identifiant de l'entrepôt • operation_type (text) — type d'opération : « livraison », « expédition », « transfert » • quantity (int) — nombre d'unités du produit dans l'opération • operation_date (timestamp) — date et heure de l'opération • processing_time (int) — temps de traitement de l'opération La colonne processing_time peut contenir des valeurs nulles. Format de sortie La requête doit retourner une table avec les champs dans cet ordre : • warehouse_id (int) — identifiant unique de l'entrepôt • count_operations (int) — nombre total d'opérations effectuées dans l'entrepôt • sum_quantity (int) — nombre total de produits traités dans l'entrepôt • avg_processing_time (numeric) — temps moyen de traitement de l'opération (en minutes), en ne considérant que les opérations avec un temps non nul, arrondi à l'entier le plus proche • max_quantity (int) — quantité maximale de produits traités en une seule opération • min_quantity (int) — quantité minimale de produits traités en une seule opération • supply_operations (int) — nombre d'opérations de type « livraison » • shipment_operations (int) — nombre d'opérations de type « expédition » • transfer_operations (int) — nombre d'opérations de type « transfert »
Une séquence spéciale, appelée even_sequence, a été créée pour générer uniquement des nombres pairs. Que doit-on mettre à la place de [...], pour que si aucune valeur n’est spécifiée pour even_column lors de l’insertion, la valeur provienne de even_sequence? create table some_table( even_column [...] ); integer computed as nextval('even_sequence') integer generated always as identity (start with 2 increment by 2) integer default nextval('even_sequence') integer unique default nextval('even_sequence') integer generated by even_sequence’
Que aimeriez-vous faire dans notre équipe?
Avez-vous de l'expérience avec la bibliothèque Langchain ? Quelles tâches avez-vous résolues avec son aide ?
Quel type de jointure doit être utilisé pour inclure dans la sélection tous les utilisateurs, même ceux qui n'ont pas de commandes ? Tables : users(id, name) et orders(id, user_id, created_at). CROSS JOIN RIGHT JOIN INNER JOIN FULL JOIN LEFT JOIN
Comment Git Flow recommande-t-il de formaliser une nouvelle version de l'application? - En créant une nouvelle branche issue - En créant une branche hotfix à partir de master - En créant une branche release séparée à partir de develop - En faisant un commit direct dans la branche master - En fusionnant directement la branche master dans develop
Quelle des affirmations suivantes reflète les conséquences de ces actions du point de vue de la méthodologie Git Flow étendue et de la gestion de l'historique des modifications?
Vous travaillez sur une nouvelle fonctionnalité dans la branche dev. Soudain, il devient nécessaire de basculer rapidement sur la branche main pour corriger une faute de frappe dans le fichier README.md. Vous avez plusieurs modifications non indexées : dans src/feature.js (non indexé) et styles/main.css (indexé). Vous souhaitez sauvegarder temporairement toutes ces modifications pour y revenir plus tard dans la branche dev. Quelle séquence de commandes devriez-vous utiliser pour cela? git stash save "WIP on feature" && git checkout main && [fix] && git checkout dev && git stash pop git stash push -m "WIP on feature" && git checkout main && [fix] && git checkout dev && git stash pop git stash && git checkout main && [fix] && git checkout dev && git stash apply git add . && git stash && git checkout main && [fix] && git checkout dev && git stash drop git commit -m "Temp commit" && git checkout main && [fix] && git checkout dev && git reset HEAD^
Analyse des ventes par catégories de produits dans un magasin de détail Vous travaillez en tant qu'analyste dans un magasin de détail. Votre tâche est de créer un rapport de ventes par catégories de produits avec les calculs suivants : • nombre total d'unités vendues dans la catégorie (total_units_sold); • chiffre d'affaires total par catégorie, en tenant compte des remises, où la remise est calculée comme unit_price × units_sold × (1 − discount/100). Si aucune remise (NULL), considérer 0%. Arrondir à deux décimales; • moyenne des unités vendues par vente (avg_units_per_sale), arrondie à deux décimales; • part des ventes sans remise (no_discount_share) — nombre de ventes avec NULL ou 0% de remise, divisé par le nombre total de ventes dans la catégorie, arrondi à trois décimales. Triez d'abord par revenu total (total_revenue) décroissant, puis par moyenne d'unités par vente (avg_units_per_sale) croissant, et enfin par nom de catégorie en ordre alphabétique. Format d'entrée Table sales: • sale_id (int) — identifiant unique de la vente • product_id (int) — identifiant du produit • category (text) — catégorie du produit • sale_date (timestamp) — date et heure de la vente • units_sold (int) — unités vendues • unit_price (numeric) — prix par unité • discount (numeric) — remise en pourcentage, peut être NULL La colonne discount peut contenir des valeurs nulles. Format de sortie La requête doit retourner une table avec les champs dans cet ordre : • category (text) — catégorie du produit • total_units_sold (int) — nombre total d'unités vendues dans la catégorie • total_revenue (numeric) — revenus totaux par catégorie, arrondis à deux décimales • avg_units_per_sale (numeric) — moyenne d'unités par vente, arrondie à deux décimales • no_discount_share (numeric) — part des ventes sans remise (valeur entre 0 et 1), arrondée à trois décimales Les résultats doivent être triés d'abord par total_revenue décroissant, puis par avg_units_per_sale croissant, et enfin par catégorie en ordre alphabétique.
Vous avez découvert que dans l'historique du dépôt principal Git, il y a des commits contenant des données confidentielles critiques. Ces données doivent être complètement supprimées de toute l'histoire du dépôt. Évaluez à quel point il serait correct et sûr d'utiliser la stratégie suivante : créer un nouveau commit qui supprime les données confidentielles de la version actuelle des fichiers et le pousser dans main. - Correct, mais pas optimal. Il vaut mieux utiliser git revert pour annuler des commits - Correcte conditionnellement. C'est une solution temporaire jusqu'à ce qu'une méthode plus radicale pour supprimer les données soit trouvée - Incorrecte et non sécurisée. Les données seront supprimées de la version actuelle, mais resteront accessibles dans l'historique du dépôt - Incorrecte. Ce commit peut entraîner de nouveaux conflits lors de la fusion avec d'autres branches - Correct et sécurisé. Cette méthode garantit que les données seront supprimées et ne réapparaîtront plus dans le dépôt
Avez-vous de l'expérience avec le framework web Gin ? Parlez-nous plus en détail des tâches que vous avez résolues avec lui.
Dans PostgreSQL, il est nécessaire d'optimiser les performances des transactions en utilisant un niveau d'isolation minimal, où : • les transactions parallèles peuvent voir des modifications non finalisées les unes des autres ; • des "lectures sales" (dirty read) sont possibles. Quel niveau d'isolation doit être spécifié pour la transaction afin d'atteindre cet objectif ? la lecture sale est impossible dans PostgreSQL lecture répétable lecture non validée lecture validée Serializable
Part de trafic des bots L'équipe antifraude a développé un mécanisme pour détecter le trafic des bots sur le site de la boutique : lorsqu'un bot accède au site, la sous-chaîne "bot" (sans tenir compte de la casse) est ajoutée aux paramètres de son URL. Si l'user_id a été identifié comme bot au moins une fois en décembre, il doit toujours être considéré comme bot. Étudiez le jeu de données des visites des utilisateurs sur le site et calculez la part des bots par rapport au nombre total d'utilisateurs en décembre 2024 (arrondi à un chiffre après la virgule). Format d'entrée Table visits: - event_date (date) — date de la visite - user_id (int) — identifiant unique de l'utilisateur - url (string) — lien par lequel la visite a été effectuée Les données ne contiennent pas de valeurs manquantes ou incorrectes. Format de sortie La requête doit retourner une table avec les champs: - share (float) — part des bots par rapport au total des utilisateurs en décembre, arrondée à un chiffre après la virgule.