- L3 MIASHS/Ingémath/METIS
- Université Paris Cité
- Année 2024-2025
- Course Homepage
- Moodle
Toutes les questions portent sur les schémas pagila
et world
rappelés ci-dessous.
Pour chaque question, proposer une requête écrite en algèbre relationnelle OU en SQL
.
world
pagila
, filmsSchéma pagila
- Lister la somme des paiments encaissés par année et par magasin.
En PostgreSQL, on obtient le (numéro du) mois à partir d’une valeur de type timestamp
avec la fonction EXTRACT()
. On peut extraire les autres éléments de l’estampille de façon semblable, par exemple :
SELECT
EXTRACT(YEAR FROM rental_date) AS annee
FROM
pagila.rental;
Solution
SELECT
st.store_id,EXTRACT(YEAR FROM pay.payment_date) AS annee,
SUM(amount) AS payments
FROM
pagila.payment pay JOIN
USING(staff_id)
pagila.staff st GROUP BY
st.store_id, EXTRACT(YEAR FROM pay.payment_date)
;
- Lister l’identifiant, le nom, le prénom, de chaque employé ainsi que le total des paiements perçus par cet employé, et sa part dans le revenu de son magasin.
Solution
SELECT
st.store_id,
st.staff_id,SUM(pay.amount) AS encaisse
FROM
pagila.staff stJOIN
USING(staff_id)
pagila.payment pay GROUP BY ROLLUP(st.store_id, st.staff_id) ;
- Lister par catégorie de film, les cinq titres qui ont engendré le plus gros chiffre d’affaire/revenu (somme des paiements perçus)
Solution
WITH film_payment AS (
SELECT
film_id,
fi.title,SUM(amount) AS caffaires
FROM
pagila.payment pay JOIN
USING(rental_id)
pagila.rental re JOIN
USING(inventory_id)
pagila.inventory inv JOIN
USING(film_id)
pagila.film fi GROUP BY
film_id, fi.titleAS (
), rank_per_cat SELECT
category_id,
ca.name,
film_id,
title,
caffaires,RANK() OVER win AS rnk
FROM
film_payment fp JOIN
USING(film_id)
pagila.film_category fc JOIN
category ca USING(category_id)
pagila.AS (PARTITION BY category_id ORDER BY caffaires DESC)
WINDOW win
)
SELECT
name,
title,
caffaires,
rnkFROM rank_per_cat
WHERE rnk <= 5
ORDER BY name, rnk
;
Schéma world
- Lister pour chaque pays, la proportion de la population qui utilise l’une des deux langues les plus populaires du pays,
Solution
WITH ranking AS (
SELECT
countrycode, name_country, language, percentage,RANK() OVER win AS rnk
FROM
world.country coJOIN
USING(countrycode)
world.countrylanguage cl
WINDOW AS (PARTITION by countrycode ORDER BY percentage DESC)
win
)
SELECT
countrycode, name_country, SUM(percentage) AS prop
FROM
rankingWHERE
<= 2
rnk GROUP BY countrycode, name_country
ORDER BY prop DESC;
Solution
- Lister pour chaque région (attribut
region
decountry
) les 10 villes les plus peuplées.
Solution
WITH R AS (
SELECT
co.countrycode, co.name_country,
ci.name,RANK() OVER win AS rnk
FROM
world.country coJOIN
USING(countrycode)
world.city ci AS (PARTITION BY co.countrycode ORDER BY ci.population DESC)
WINDOW win
)
SELECT
name_country, ', ')
string_agg(name, FROM
RWHERE rnk <= 2
GROUP BY countrycode, name_country
;
- Lister pour chaque langue, les deux pays où on trouve le plus grand nombre d’utilisateurs.
Solution
WITH R AS (
SELECT
language,
name_country, *population_country/100.0 AS pop_loc,
percentageRANK() OVER win AS rnk
FROM
world.countrylanguage cl NATURAL JOIN
world.countryWHERE
IS NOT NULL
population_country AS (PARTITION BY language ORDER BY percentage*population_country DESC)
WINDOW win
)
SELECT
language, ', ') AS pays, SUM(pop_loc) AS loc
string_agg(name_country, FROM
R WHERE rnk <= 2
GROUP BY language ;
- Lister les pays en donnant leur rang par
gnp
(pnb
) par habitant décroissant et leur rang par espérance de vie à la naissance (lifeexpectancy
) décroissante.
Solution
SELECT
name_country,
lifeexpectancy , RANK() OVER win_gnp AS rnk_gnppercap,
RANK() OVER win_life AS rnk_lifeexp
FROM
world.countryWHERE
IS NOT NULL AND
gnp IS NOT NULL AND
population_country IS NOT NULL
lifeexpectancy
WINDOW AS (ORDER BY gnp/population_country DESC),
win_gnp AS (ORDER BY lifeexpectancy DESC)
win_life ORDER BY lifeexpectancy DESC ;