Skip to content

Ben Iman ABDALLAH

Depuis ses débuts, l’ONG GoodThought agit comme un véritable moteur de changement positif. Son engagement se concentre sur trois piliers essentiels : l’éducation, la santé et le développement durable. À travers ces axes, elle œuvre pour transformer durablement les communautés à travers le monde.

Animée par cette mission, GoodThought a mis en place une multitude de projets visant à soutenir les populations défavorisées et à favoriser une croissance à long terme. Chaque initiative est pensée pour maximiser l’impact social et améliorer concrètement les conditions de vie.

Je vous invite à plonger au cœur de l’action humanitaire, en explorant comment les données peuvent orienter et renforcer les efforts de terrain. La base de données PostgreSQL de GoodThought regroupe des informations détaillées sur les projets menés entre 2010 et 2023.

Ce jeu de données riche et structuré comprend :

  • Assignments: les détails de chaque mission (nom, durée, budget, région géographique, score d’impact).
  • Donations: les contributions financières, associées aux donateurs et aux projets, illustrant comment les fonds sont répartis et utilisés.
  • Donors: les profils des donateurs, qu’il s’agisse d’individus ou d’organisations, avec leur typologie.

Référez-vous au diagramme ERD ci-dessous pour une représentation visuelle des relations entre les tables de données :

Tâche 1 :

Listons les cinq missions principales en fonction de la valeur totale des dons, classées par type de donateur. Le résultat doit inclure quatre colonnes :

assignment_name, region, rounded_total_donation_amount arrondi à deux décimales, donor_type, trié par rounded_total_donation_amount par ordre décroissant.

Spinner
DataFrameas
highest_donation_assignments
variable
-- highest_donation_assignments
SELECT 
	assignment_name,
	region,
	ROUND(SUM(amount),2) rounded_total_donation_amount,
	donor_type
FROM donations AS dnt
INNER JOIN assignments AS a
	ON a.assignment_id = dnt.assignment_id
JOIN donors AS d
	ON d.donor_id = dnt.donor_id
GROUP BY assignment_name, region, donor_type
ORDER BY rounded_total_donation_amount DESC
LIMIT 5;

Tâche 2

Identifions la mission ayant le score d’impact le plus élevé dans chaque région, en s’assurant que chaque mission listée a reçu au moins un don. Le résultat doit inclure quatre colonnes :

assignment_name, region, impact_score, num_total_donations, trié par region en ordre croissant. Inclure uniquement la mission ayant le score le plus élevé par région, en évitant les doublons dans une même région.

Spinner
DataFrameas
top_regional_impact_assignments
variable
-- top_regional_impact_assignments

-- *C1 : Création d'une table commune

WITH ranked_assignments AS (SELECT 
	a.assignment_name,
	a.region,
	a.impact_score,
	COUNT(dnt.amount) AS num_total_donations,
	-- *C2 : Création d'une fenêtre
	ROW_NUMBER() OVER (PARTITION BY a.region ORDER BY a.impact_score DESC) AS rank
FROM donations AS dnt
INNER JOIN assignments AS a
	ON a.assignment_id = dnt.assignment_id
JOIN donors AS d
	ON d.donor_id = dnt.donor_id
GROUP BY a.assignment_name, a.region, a.impact_score
ORDER BY impact_score DESC, region )

-- *C3 : Utilisation de la boîte ranked_assignments
SELECT
	assignment_name,
	region,
	impact_score,
	num_total_donations
FROM ranked_assignments
WHERE rank = 1
ORDER BY region;

*C1 : Je crée une table commune (CTE), c'est comme si je mettais un programme très complexe dans une boîte. Ensuite, je peux réutiliser cette boîte autant de fois que je veux, sans avoir à me soucier du désordre qu’il y a à l'intérieur.

*C2 : L'objectif est de numéroter chaque mission (assignment) à l'intérieur de sa région, en triant les missions par score d'impact décroissant. Par exemple, pour une région donnée, on regarde toutes les missions, on commence par celle qui a le plus d'impact (rang 1), puis la suivante (rang 2), et ainsi de suite. Et on répète ce classement pour chaque région séparément.

*C3 : Voilà, on utilise maintenant notre fameuse boîte appelée ranked_assignments pour sélectionner, dans chaque région, la mission qui a le plus grand impact. En gros, on ouvre la boîte, on regarde les missions classées, et on garde uniquement la numéro 1 pour chaque région.

FIN