Il y a plusieurs approches possibles.
Avec une fonction fenêtrée et en passant par un résultat intermédiaire (les COUNT(DISTINCT) fenêtrés n'étant pas supportés) :
with
dataset (dateobs, espece) as (
values
('01/01/2024', 'Oiseau bleu'),
('01/01/2024', 'Aigle noir'),
('02/01/2024', 'Oiseau bleu'),
('02/01/2024', 'Flamand rose'),
('03/01/2024', 'Rougegorge')
),
rapport (espece, premiere_dateobs) as (
select all espece, min(dateobs)
from dataset
group by espece
)
select all
premiere_dateobs as dateobs,
sum(count(*)) over (order by premiere_dateobs asc) as cumul_nb_especes
from rapport
group by 1
order by 1 asc;
Avec une sous-requête corrélée dans le SELECT :
with dataset (dateobs, espece) as (
values
('01/01/2024', 'Oiseau bleu'),
('01/01/2024', 'Aigle noir'),
('02/01/2024', 'Oiseau bleu'),
('02/01/2024', 'Flamand rose'),
('03/01/2024', 'Rougegorge')
)
select distinct
dateobs,
(select count(distinct espece) from dataset where dateobs <= d.dateobs) as cumul_nb_especes
from dataset as d
order by 1 asc;
Tu dois aussi pouvoir le faire avec une auto-jointure.
Testées OK sur SQLite et PostgreSQL.
Bien sûr dans la pratique il faudra que la colonne dateobs soit bien du type DATE. J'ai laissé les JJ/MM/AAAA par pure flemme
Partager