Module S70
Dalibo SCOP
25.09
5 septembre 2025
| Formation | Module S70 |
| Titre | Analyse de données avec SQL |
| Révision | 25.09 |
| https://dali.bo/s70_pdf | |
| EPUB | https://dali.bo/s70_epub |
| HTML | https://dali.bo/s70_html |
| Slides | https://dali.bo/s70_slides |
| TP | https://dali.bo/s70_tp |
| TP (solutions) | https://dali.bo/s70_solutions |
Cette formation est sous licence CC-BY-NC-SA. Vous êtes libre de la redistribuer et/ou modifier aux conditions suivantes :
PostgreSQL® Postgres® et le logo Slonik sont des marques déposées par PostgreSQL Community Association of Canada.
Ce document ne couvre que les versions supportées de PostgreSQL au moment de sa rédaction, soit les versions 13 à 17.
FILTERWINDOWGROUPING SETS, ROLLUP,
CUBEWITHIN GROUPSemployespopulation et continentsGROUP BYGROUP BYORDER BY dans la fonction d’agrégatarray_agg, string_agg
et xmlaggFILTERCASE complexesDes fonctionnalités trop peu connues
SELECT matricule, salaire, service,
SUM(salaire) OVER (PARTITION BY service)
AS total_salaire_service
FROM employes; matricule | salaire | service | total_salaire_service
-----------+----------+-------------+-----------------------
00000004 | 4500.00 | Courrier | 7500.00
00000020 | 3000.00 | Courrier | 7500.00
00000001 | 10000.00 | Direction | 10000.00
00000006 | 4000.00 | Publication | 7000.00
00000040 | 3000.00 | Publication | 7000.00OVER ( … )
SELECT matricule, nom, salaire, service,
rank() OVER (ORDER BY salaire),
dense_rank() OVER (ORDER BY salaire) -- pas de trous
FROM employes ; matricule | nom | salaire | service | rank | dense_rank
-----------+----------+----------+-------------+------+------------
00000020 | Lagaffe | 3000.00 | Courrier | 1 | 1
00000040 | Lebrac | 3000.00 | Publication | 1 | 1
00000006 | Prunelle | 4000.00 | Publication | 3 | 2
00000004 | Fantasio | 4500.00 | Courrier | 4 | 3
00000001 | Dupuis | 10000.00 | Direction | 5 | 4
OVER (PARTITION BY … ORDER BY …)SELECT continent, pays, population,
rank() OVER (PARTITION BY continent
ORDER BY population DESC)
AS rang
FROM population; continent | pays | population | rang
------------------+--------------------+------------+------
Afrique | Nigéria | 173.6 | 1
Afrique | Éthiopie | 94.1 | 2
Afrique | Égypte | 82.1 | 3
Afrique | Rép. dém. du Congo | 67.5 | 4
(…)
Amérique du Nord | États-Unis | 320.1 | 1
Amérique du Nord | Canada | 35.2 | 2
(…)first_value (), last_value,
nth (), lag(), lead()…SELECT pays, continent, population,
lag(population) OVER (PARTITION BY continent
ORDER BY population DESC)
FROM population
WHERE continent in ('Europe','Afrique'); pays | continent | population | lag
-----------------------+-----------+------------+--------
Nigéria | Afrique | 173.6 |
Éthiopie | Afrique | 94.1 | 173.6
Égypte | Afrique | 82.1 | 94.1
…
Tunisie | Afrique | 11.0 | 14.1
Féd. de Russie | Europe | 142.8 |
Allemagne | Europe | 82.7 | 142.8
France métropolitaine | Europe | 64.3 | 82.7
Royaume-Uni | Europe | 63.1 | 64.3
Italie | Europe | 61.0 | 63.1
…
Malte | Europe | 0.4 | 0.5
(53 lignes)first_value(colonne)
last_value(colonne)
nth_value(colonne, n)
SELECT pays, continent, population,
first_value(population)
OVER (PARTITION BY continent
ORDER BY population DESC)
FROM population
WHERE continent in ('Europe','Afrique'); pays | continent | population | first_value
-----------------------+-----------+------------+-------------
Nigéria | Afrique | 173.6 | 173.6
Éthiopie | Afrique | 94.1 | 173.6
Égypte | Afrique | 82.1 | 173.6
…
Féd. de Russie | Europe | 142.8 | 142.8
Allemagne | Europe | 82.7 | 142.8
France métropolitaine | Europe | 64.3 | 142.8
…OVER (ORDER BY …) par défaut est :RANGE (par plage ; ci-dessus)ROWS (par nombre de lignes)GROUPS (selon valeurs des lignes)UNBOUNDED PRECEDING: depuis le début de la
partitionCURRENT ROW : depuis la ligne couranteUNBOUNDED FOLLOWING : jusqu’à la fin de la
partitionCURRENT ROW : jusqu’à la ligne couranteSELECT pays, continent, population,
last_value(population) OVER (
PARTITION BY continent
ORDER BY population DESC
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
)
FROM population
WHERE continent in ('Europe','Afrique'); pays | continent | population | last_value
-----------------------+-----------+------------+------------
Nigéria | Afrique | 173.6 | 11.0
Éthiopie | Afrique | 94.1 | 11.0
Égypte | Afrique | 82.1 | 11.0
Rép. dém. du Congo | Afrique | 67.5 | 11.0
…
Tunisie | Afrique | 11.0 | 11.0
Féd. de Russie | Europe | 142.8 | 0.4
Allemagne | Europe | 82.7 | 0.4
France métropolitaine | Europe | 64.3 | 0.4
…
Malte | Europe | 0.4 | 0.4
xxx PRECEDING : depuis les xxx valeurs devant la ligne
couranteCURRENT ROW : depuis la ligne courantexxx FOLLOWING : depuis les xxx valeurs derrière la
ligne couranteCURRENT ROW : jusqu’à la ligne courantexxx PRECEDING : depuis les xxx groupes de valeurs
identiques devant la ligne couranteCURRENT ROW : depuis la ligne courante ou le premier
élément identique selonORDER BYxxx FOLLOWING : depuis les xxx groupes de valeurs
identiques derrière la ligne couranteCURRENT ROW : jusqu’à la ligne courante ou le dernier
élément identique selon ORDER BYEXCLUDE CURRENT ROW : exclut la ligne couranteEXCLUDE GROUP : exclut la ligne courante et le groupe
de valeurs identiques dans l’ordreEXCLUDE TIES : exclut les valeurs identiques à la ligne
courante dans l’ordre mais pas la ligne couranteEXCLUDE NO OTHERS : pas d’exclusion (par défaut)WITHIN GROUPGROUPING SETS / ROLLUP / CUBEGROUP BYROLLUPCUBE piece | region | sum
--------+--------+-----
| | 320
ecrous | ouest | 0
clous | nord | 0
vis | nord | 60
clous | est | 70
vis | sud | 50
ecrous | est | 50
ecrous | sud | 40
vis | ouest | 50
vis | | 160
ecrous | | 90
clous | | 70
| ouest | 50
| nord | 60
| est | 120
| sud | 90
CUBE peut le pluspsql : \crosstabviewtablefunc, fonction
crosstab (text,text)