diff --git a/data_layer/sqitch/deploy/stats/locales.sql b/data_layer/sqitch/deploy/stats/locales.sql index 40922872d3..e494af7be1 100644 --- a/data_layer/sqitch/deploy/stats/locales.sql +++ b/data_layer/sqitch/deploy/stats/locales.sql @@ -2,172 +2,114 @@ BEGIN; --- locales_evolution_collectivite_avec_minimum_fiches -drop view stats_locales_evolution_collectivite_avec_minimum_fiches; -drop materialized view stats.locales_evolution_collectivite_avec_minimum_fiches; - -create materialized view stats.locales_evolution_collectivite_avec_minimum_fiches as -with fiche_collectivite as (select mb.first_day as mois, - c.collectivite_id, - c.region_code, - c.departement_code, - coalesce(count(*) filter (where fa.created_at <= mb.last_day), 0::bigint) as fiches - from stats.monthly_bucket mb - join stats.collectivite c on true - left join fiche_action fa using (collectivite_id) - group by mb.first_day, c.collectivite_id, c.departement_code, c.region_code) -select fiche_collectivite.mois, - null::character varying(2) as code_region, - null::character varying(2) as code_departement, - count(*) filter (where fiche_collectivite.fiches > 5) as collectivites -from fiche_collectivite -group by fiche_collectivite.mois -union all -select fiche_collectivite.mois, - fiche_collectivite.region_code as code_region, - null::character varying as code_departement, - count(*) filter (where fiche_collectivite.fiches > 5) as collectivites -from fiche_collectivite -group by fiche_collectivite.mois, fiche_collectivite.region_code -union all -select fiche_collectivite.mois, - null::character varying as code_region, - fiche_collectivite.departement_code as code_departement, - count(*) filter (where fiche_collectivite.fiches > 5) as collectivites -from fiche_collectivite -group by fiche_collectivite.mois, fiche_collectivite.departement_code -order by 1; - -create view stats_locales_evolution_collectivite_avec_minimum_fiches -as -select * -from stats.locales_evolution_collectivite_avec_minimum_fiches; - - --- locales_evolution_nombre_fiches -drop view stats_locales_evolution_nombre_fiches; -drop materialized view stats.locales_evolution_nombre_fiches; - -create materialized view stats.locales_evolution_nombre_fiches as -select mb.first_day as mois, - null::character varying(2) as code_region, - null::character varying(2) as code_departement, - count(*) filter (where fa.created_at <= mb.last_day) as fiches -from stats.monthly_bucket mb - join stats.collectivite ca on true - join fiche_action fa using (collectivite_id) -group by mb.first_day -union all -select mb.first_day as mois, - ca.region_code as code_region, - null::character varying as code_departement, - count(*) filter (where fa.created_at <= mb.last_day) as fiches -from stats.monthly_bucket mb - join stats.collectivite ca on true - left join fiche_action fa using (collectivite_id) -group by mb.first_day, ca.region_code -union all -select mb.first_day as mois, - null::character varying as code_region, - ca.departement_code as code_departement, - count(*) filter (where fa.created_at <= mb.last_day) as fiches -from stats.monthly_bucket mb - join stats.collectivite ca on true - left join fiche_action fa using (collectivite_id) -group by mb.first_day, ca.departement_code -order by 1; - -create view stats_locales_evolution_nombre_fiches +create or replace function + stats.refresh_stats_locales() + returns void as -select * -from stats.locales_evolution_nombre_fiches; - --- évolution des activation -drop view stats_locales_evolution_total_activation; -drop materialized view stats.locales_evolution_total_activation; -create materialized view stats.locales_evolution_total_activation +$$ +begin + refresh materialized view stats.locales_evolution_total_activation; + refresh materialized view stats.locales_collectivite_actives_et_total_par_type; + refresh materialized view stats.locales_evolution_utilisateur; + refresh materialized view stats.locales_evolution_nombre_utilisateur_par_collectivite; + refresh materialized view stats.locales_pourcentage_completude; + refresh materialized view stats.locales_tranche_completude; + refresh materialized view stats.evolution_nombre_fiches; + refresh materialized view stats.locales_evolution_collectivite_avec_minimum_fiches; + refresh materialized view stats.locales_engagement_collectivite; + refresh materialized view stats.locales_evolution_indicateur_referentiel; + refresh materialized view stats.locales_evolution_resultat_indicateur_personnalise; + refresh materialized view stats.locales_evolution_resultat_indicateur_referentiel; + refresh materialized view stats.locales_evolution_nombre_fiches; + refresh materialized view stats.locales_evolution_collectivite_avec_indicateur_referentiel; +end +$$ language plpgsql; + +drop view stats_locales_labellisation_par_niveau; +drop materialized view stats.locales_labellisation_par_niveau; + +create materialized view stats.locales_labellisation_par_niveau as +WITH latest_labellisation AS ( + SELECT l.collectivite_id, + l.referentiel, + ( + SELECT ll.etoiles + FROM labellisation ll + WHERE ll.collectivite_id = l.collectivite_id + AND ll.referentiel = l.referentiel + AND ll.obtenue_le > (now() - interval '4 years') + ORDER BY ll.obtenue_le DESC + LIMIT 1 + ) AS etoiles + FROM labellisation l + GROUP BY l.collectivite_id, l.referentiel + ), + labellisation_locales AS ( + SELECT l.etoiles, + l.referentiel, + c.region_code, + c.departement_code + FROM latest_labellisation l + JOIN stats.collectivite c USING (collectivite_id) + WHERE l.etoiles is not null and l.etoiles>0 + ) +SELECT NULL::character varying(2) AS code_region, + NULL::character varying(2) AS code_departement, + labellisation_locales.referentiel, + labellisation_locales.etoiles, + count(*) AS labellisations +FROM labellisation_locales +GROUP BY labellisation_locales.referentiel, labellisation_locales.etoiles +UNION ALL +SELECT r.code AS code_region, + NULL::character varying AS code_departement, + l.referentiel, + l.etoiles, + COALESCE(count(l.*), 0::bigint) AS labellisations +FROM imports.region r +JOIN labellisation_locales l ON l.region_code::text = r.code::text +GROUP BY l.referentiel, l.etoiles, r.code +UNION ALL +SELECT NULL::character varying AS code_region, + d.code AS code_departement, + l.referentiel, + l.etoiles, + COALESCE(count(l.*), 0::bigint) AS labellisations +FROM imports.departement d +JOIN labellisation_locales l ON l.departement_code::text = d.code::text +GROUP BY l.referentiel, l.etoiles, d.code; + +create view stats_locales_labellisation_par_niveau as +SELECT code_region, + code_departement, + referentiel, + etoiles, + labellisations +FROM stats.locales_labellisation_par_niveau; + +create or replace function + stats.refresh_stats_locales() + returns void as -select -- permet de filtrer - m.first_day as mois, - null:: varchar(2) as code_region, - null::varchar(2) as code_departement, - - -- stats nationales - (select count(*) as count - from stats.collectivite_utilisateur cu - where cu.date_activation <= m.last_day) as total, - (select count(*) filter (where stats.is_fiscalite_propre(cu.nature_collectivite)) as count - from stats.collectivite_utilisateur cu - where cu.date_activation <= m.last_day) as total_epci, - (select count(*) filter (where cu.type_collectivite = 'syndicat'::type_collectivite) as count - from stats.collectivite_utilisateur cu - where cu.date_activation <= m.last_day) as total_syndicat, - (select count(*) filter (where cu.type_collectivite = 'commune'::type_collectivite) as count - from stats.collectivite_utilisateur cu - where cu.date_activation <= m.last_day) as total_commune, - (select count(*) filter (where cu.type_collectivite != 'commune'::type_collectivite - and cu.type_collectivite != 'syndicat'::type_collectivite - and not stats.is_fiscalite_propre(cu.nature_collectivite)) as count - from stats.collectivite_utilisateur cu - where cu.date_activation <= m.last_day) as total_autre -from stats.monthly_bucket m - -union all - -select m.first_day as mois, - r.code, - null, - (select count(*) filter ( where cu.region_code = r.code) - from stats.collectivite_utilisateur cu - where cu.date_activation <= m.last_day), - (select count(*) filter ( where stats.is_fiscalite_propre(cu.nature_collectivite) and cu.region_code = r.code) - from stats.collectivite_utilisateur cu - where cu.date_activation <= m.last_day), - (select count(*) filter ( where cu.type_collectivite = 'syndicat' and cu.region_code = r.code) - from stats.collectivite_utilisateur cu - where cu.date_activation <= m.last_day), - (select count(*) filter ( where cu.type_collectivite = 'commune' and cu.region_code = r.code) - from stats.collectivite_utilisateur cu - where cu.date_activation <= m.last_day), - (select count(*) filter ( where cu.type_collectivite != 'commune'::type_collectivite - and cu.type_collectivite != 'syndicat'::type_collectivite - and not stats.is_fiscalite_propre(cu.nature_collectivite) - and cu.region_code = r.code) - from stats.collectivite_utilisateur cu - where cu.date_activation <= m.last_day) - -from imports.region r - join stats.monthly_bucket m on true - -union all - -select m.first_day as mois, - null, - d.code, - (select count(*) filter ( where departement_code = d.code) - from stats.collectivite_utilisateur cu - where cu.date_activation <= m.last_day), - (select count(*) filter ( where stats.is_fiscalite_propre(cu.nature_collectivite) and departement_code = d.code) - from stats.collectivite_utilisateur cu - where cu.date_activation <= m.last_day), - (select count(*) filter ( where cu.type_collectivite = 'syndicat' and departement_code = d.code) - from stats.collectivite_utilisateur cu - where cu.date_activation <= m.last_day), - (select count(*) filter ( where cu.type_collectivite = 'commune' and departement_code = d.code) - from stats.collectivite_utilisateur cu - where cu.date_activation <= m.last_day), - (select count(*) filter ( where cu.type_collectivite != 'commune'::type_collectivite - and cu.type_collectivite != 'syndicat'::type_collectivite - and not stats.is_fiscalite_propre(cu.nature_collectivite) - and departement_code = d.code) - from stats.collectivite_utilisateur cu - where cu.date_activation <= m.last_day) - -from imports.departement d - join stats.monthly_bucket m on true; +$$ +begin + refresh materialized view stats.locales_evolution_total_activation; + refresh materialized view stats.locales_collectivite_actives_et_total_par_type; + refresh materialized view stats.locales_evolution_utilisateur; + refresh materialized view stats.locales_evolution_nombre_utilisateur_par_collectivite; + refresh materialized view stats.locales_pourcentage_completude; + refresh materialized view stats.locales_tranche_completude; + refresh materialized view stats.evolution_nombre_fiches; + refresh materialized view stats.locales_evolution_collectivite_avec_minimum_fiches; + refresh materialized view stats.locales_engagement_collectivite; + refresh materialized view stats.locales_labellisation_par_niveau; + refresh materialized view stats.locales_evolution_indicateur_referentiel; + refresh materialized view stats.locales_evolution_resultat_indicateur_personnalise; + refresh materialized view stats.locales_evolution_resultat_indicateur_referentiel; + refresh materialized view stats.locales_evolution_nombre_fiches; + refresh materialized view stats.locales_evolution_collectivite_avec_indicateur_referentiel; +end +$$ language plpgsql; -create view stats_locales_evolution_total_activation as -select * -from stats.locales_evolution_total_activation; COMMIT; diff --git a/data_layer/sqitch/deploy/stats/locales@v2.106.0.sql b/data_layer/sqitch/deploy/stats/locales@v2.106.0.sql new file mode 100644 index 0000000000..40922872d3 --- /dev/null +++ b/data_layer/sqitch/deploy/stats/locales@v2.106.0.sql @@ -0,0 +1,173 @@ +-- Deploy tet:stats/locale to pg + +BEGIN; + +-- locales_evolution_collectivite_avec_minimum_fiches +drop view stats_locales_evolution_collectivite_avec_minimum_fiches; +drop materialized view stats.locales_evolution_collectivite_avec_minimum_fiches; + +create materialized view stats.locales_evolution_collectivite_avec_minimum_fiches as +with fiche_collectivite as (select mb.first_day as mois, + c.collectivite_id, + c.region_code, + c.departement_code, + coalesce(count(*) filter (where fa.created_at <= mb.last_day), 0::bigint) as fiches + from stats.monthly_bucket mb + join stats.collectivite c on true + left join fiche_action fa using (collectivite_id) + group by mb.first_day, c.collectivite_id, c.departement_code, c.region_code) +select fiche_collectivite.mois, + null::character varying(2) as code_region, + null::character varying(2) as code_departement, + count(*) filter (where fiche_collectivite.fiches > 5) as collectivites +from fiche_collectivite +group by fiche_collectivite.mois +union all +select fiche_collectivite.mois, + fiche_collectivite.region_code as code_region, + null::character varying as code_departement, + count(*) filter (where fiche_collectivite.fiches > 5) as collectivites +from fiche_collectivite +group by fiche_collectivite.mois, fiche_collectivite.region_code +union all +select fiche_collectivite.mois, + null::character varying as code_region, + fiche_collectivite.departement_code as code_departement, + count(*) filter (where fiche_collectivite.fiches > 5) as collectivites +from fiche_collectivite +group by fiche_collectivite.mois, fiche_collectivite.departement_code +order by 1; + +create view stats_locales_evolution_collectivite_avec_minimum_fiches +as +select * +from stats.locales_evolution_collectivite_avec_minimum_fiches; + + +-- locales_evolution_nombre_fiches +drop view stats_locales_evolution_nombre_fiches; +drop materialized view stats.locales_evolution_nombre_fiches; + +create materialized view stats.locales_evolution_nombre_fiches as +select mb.first_day as mois, + null::character varying(2) as code_region, + null::character varying(2) as code_departement, + count(*) filter (where fa.created_at <= mb.last_day) as fiches +from stats.monthly_bucket mb + join stats.collectivite ca on true + join fiche_action fa using (collectivite_id) +group by mb.first_day +union all +select mb.first_day as mois, + ca.region_code as code_region, + null::character varying as code_departement, + count(*) filter (where fa.created_at <= mb.last_day) as fiches +from stats.monthly_bucket mb + join stats.collectivite ca on true + left join fiche_action fa using (collectivite_id) +group by mb.first_day, ca.region_code +union all +select mb.first_day as mois, + null::character varying as code_region, + ca.departement_code as code_departement, + count(*) filter (where fa.created_at <= mb.last_day) as fiches +from stats.monthly_bucket mb + join stats.collectivite ca on true + left join fiche_action fa using (collectivite_id) +group by mb.first_day, ca.departement_code +order by 1; + +create view stats_locales_evolution_nombre_fiches +as +select * +from stats.locales_evolution_nombre_fiches; + +-- évolution des activation +drop view stats_locales_evolution_total_activation; +drop materialized view stats.locales_evolution_total_activation; +create materialized view stats.locales_evolution_total_activation +as +select -- permet de filtrer + m.first_day as mois, + null:: varchar(2) as code_region, + null::varchar(2) as code_departement, + + -- stats nationales + (select count(*) as count + from stats.collectivite_utilisateur cu + where cu.date_activation <= m.last_day) as total, + (select count(*) filter (where stats.is_fiscalite_propre(cu.nature_collectivite)) as count + from stats.collectivite_utilisateur cu + where cu.date_activation <= m.last_day) as total_epci, + (select count(*) filter (where cu.type_collectivite = 'syndicat'::type_collectivite) as count + from stats.collectivite_utilisateur cu + where cu.date_activation <= m.last_day) as total_syndicat, + (select count(*) filter (where cu.type_collectivite = 'commune'::type_collectivite) as count + from stats.collectivite_utilisateur cu + where cu.date_activation <= m.last_day) as total_commune, + (select count(*) filter (where cu.type_collectivite != 'commune'::type_collectivite + and cu.type_collectivite != 'syndicat'::type_collectivite + and not stats.is_fiscalite_propre(cu.nature_collectivite)) as count + from stats.collectivite_utilisateur cu + where cu.date_activation <= m.last_day) as total_autre +from stats.monthly_bucket m + +union all + +select m.first_day as mois, + r.code, + null, + (select count(*) filter ( where cu.region_code = r.code) + from stats.collectivite_utilisateur cu + where cu.date_activation <= m.last_day), + (select count(*) filter ( where stats.is_fiscalite_propre(cu.nature_collectivite) and cu.region_code = r.code) + from stats.collectivite_utilisateur cu + where cu.date_activation <= m.last_day), + (select count(*) filter ( where cu.type_collectivite = 'syndicat' and cu.region_code = r.code) + from stats.collectivite_utilisateur cu + where cu.date_activation <= m.last_day), + (select count(*) filter ( where cu.type_collectivite = 'commune' and cu.region_code = r.code) + from stats.collectivite_utilisateur cu + where cu.date_activation <= m.last_day), + (select count(*) filter ( where cu.type_collectivite != 'commune'::type_collectivite + and cu.type_collectivite != 'syndicat'::type_collectivite + and not stats.is_fiscalite_propre(cu.nature_collectivite) + and cu.region_code = r.code) + from stats.collectivite_utilisateur cu + where cu.date_activation <= m.last_day) + +from imports.region r + join stats.monthly_bucket m on true + +union all + +select m.first_day as mois, + null, + d.code, + (select count(*) filter ( where departement_code = d.code) + from stats.collectivite_utilisateur cu + where cu.date_activation <= m.last_day), + (select count(*) filter ( where stats.is_fiscalite_propre(cu.nature_collectivite) and departement_code = d.code) + from stats.collectivite_utilisateur cu + where cu.date_activation <= m.last_day), + (select count(*) filter ( where cu.type_collectivite = 'syndicat' and departement_code = d.code) + from stats.collectivite_utilisateur cu + where cu.date_activation <= m.last_day), + (select count(*) filter ( where cu.type_collectivite = 'commune' and departement_code = d.code) + from stats.collectivite_utilisateur cu + where cu.date_activation <= m.last_day), + (select count(*) filter ( where cu.type_collectivite != 'commune'::type_collectivite + and cu.type_collectivite != 'syndicat'::type_collectivite + and not stats.is_fiscalite_propre(cu.nature_collectivite) + and departement_code = d.code) + from stats.collectivite_utilisateur cu + where cu.date_activation <= m.last_day) + +from imports.departement d + join stats.monthly_bucket m on true; + +create view stats_locales_evolution_total_activation as +select * +from stats.locales_evolution_total_activation; + +COMMIT; diff --git a/data_layer/sqitch/deploy/stats/vues_BI.sql b/data_layer/sqitch/deploy/stats/vues_BI.sql index 1e61a780b5..e6bccb6a7c 100644 --- a/data_layer/sqitch/deploy/stats/vues_BI.sql +++ b/data_layer/sqitch/deploy/stats/vues_BI.sql @@ -2,82 +2,94 @@ BEGIN; --- evolution_collectivite_avec_minimum_fiches -drop view stats_evolution_collectivite_avec_minimum_fiches; -drop materialized view stats.evolution_collectivite_avec_minimum_fiches; - -create materialized view stats.evolution_collectivite_avec_minimum_fiches as -with fiche_collectivite as (select mb.first_day as mois, - ca.collectivite_id, - count(*) filter (where fa.created_at <= mb.last_day) as fiches - from stats.monthly_bucket mb - join stats.collectivite_active ca on true - join fiche_action fa using (collectivite_id) - group by mb.first_day, ca.collectivite_id) -select fiche_collectivite.mois, - count(*) filter (where fiche_collectivite.fiches > 5) as collectivites -from fiche_collectivite -group by fiche_collectivite.mois -order by fiche_collectivite.mois; - -create view stats_evolution_collectivite_avec_minimum_fiches -as -select * -from stats.evolution_collectivite_avec_minimum_fiches; - --- evolution_nombre_fiches -drop view stats_evolution_nombre_fiches; -drop materialized view stats.evolution_nombre_fiches; - -create materialized view stats.evolution_nombre_fiches as -select mb.first_day as mois, - count(*) filter (where fa.created_at <= mb.last_day) as fiches -from stats.monthly_bucket mb - join stats.collectivite_active ca on true - join fiche_action fa using (collectivite_id) -group by mb.first_day -order by mb.first_day; - -create view stats_evolution_nombre_fiches +create or replace function + stats.refresh_views() + returns void as -select * -from stats.evolution_nombre_fiches; +$$ +begin + refresh materialized view stats.collectivite; + refresh materialized view stats.collectivite_utilisateur; + refresh materialized view stats.collectivite_referentiel; + refresh materialized view stats.collectivite_labellisation; + refresh materialized view stats.collectivite_plan_action; + refresh materialized view stats.collectivite_action_statut; + refresh materialized view stats.evolution_activation; + refresh materialized view stats.rattachement; + refresh materialized view stats.utilisateur; + refresh materialized view stats.evolution_utilisateur; + refresh materialized view stats.connection; + refresh materialized view stats.evolution_connection; + refresh materialized view stats.carte_collectivite_active; + refresh materialized view stats.evolution_total_activation_par_type; + refresh materialized view stats.collectivite_actives_et_total_par_type; + refresh materialized view stats.evolution_nombre_utilisateur_par_collectivite; + refresh materialized view stats.carte_epci_par_departement; + refresh materialized view stats.pourcentage_completude; + refresh materialized view stats.evolution_collectivite_avec_minimum_fiches; + refresh materialized view stats.evolution_indicateur_referentiel; + refresh materialized view stats.evolution_resultat_indicateur_referentiel; + refresh materialized view stats.evolution_resultat_indicateur_personnalise; + refresh materialized view stats.engagement_collectivite; + refresh materialized view stats.evolution_nombre_fiches; + refresh materialized view stats.evolution_nombre_plans; +end ; +$$ language plpgsql security definer; -create materialized view stats.evolution_nombre_plans -as -select mb.first_day as mois, - count(*) filter (where a.created_at <= mb.last_day) as plans -from stats.monthly_bucket mb - join stats.collectivite_active ca on true - join axe a using (collectivite_id) -where a.parent is null -group by mb.first_day -order by mb.first_day; +drop view stats_evolution_nombre_labellisations; +drop materialized view stats.evolution_nombre_labellisations; -create view stats_evolution_nombre_plans -as -select * -from stats.evolution_nombre_plans; +create materialized view stats.evolution_nombre_labellisations as +WITH l_details AS ( + SELECT + *, + LEAD(l.obtenue_le) OVER ( + PARTITION BY collectivite_id, referentiel ORDER BY obtenue_le + ) AS lead_obtenue_le + FROM + labellisation l + ORDER BY + collectivite_id, obtenue_le) --- évolution des labellisations -create materialized view stats.evolution_nombre_labellisations -as select mb.first_day as mois, - count(*) filter (where l.obtenue_le <= mb.last_day and l.etoiles = '1') as etoile_1, - count(*) filter (where l.obtenue_le <= mb.last_day and l.etoiles = '2') as etoile_2, - count(*) filter (where l.obtenue_le <= mb.last_day and l.etoiles = '3') as etoile_3, - count(*) filter (where l.obtenue_le <= mb.last_day and l.etoiles = '4') as etoile_4, - count(*) filter (where l.obtenue_le <= mb.last_day and l.etoiles = '5') as etoile_5 + count(collectivite_id) filter ( + where obtenue_le <= mb.last_day + and (lead_obtenue_le > mb.last_day or lead_obtenue_le IS NULL) + and obtenue_le>(mb.last_day-interval '4 years') + and etoiles = '1') as etoile_1, + count(collectivite_id) filter ( + where obtenue_le <= mb.last_day + and (lead_obtenue_le > mb.last_day or lead_obtenue_le IS NULL) + and obtenue_le>(mb.last_day-interval '4 years') + and etoiles = '2') as etoile_2, + count(collectivite_id) filter ( + where obtenue_le <= mb.last_day + and (lead_obtenue_le > mb.last_day or lead_obtenue_le IS NULL) + and obtenue_le>(mb.last_day-interval '4 years') + and etoiles = '3') as etoile_3, + count(collectivite_id) filter ( + where obtenue_le <= mb.last_day + and (lead_obtenue_le > mb.last_day or lead_obtenue_le IS NULL) + and obtenue_le>(mb.last_day-interval '4 years') + and etoiles = '4') as etoile_4, + count(collectivite_id) filter ( + where obtenue_le <= mb.last_day + and (lead_obtenue_le > mb.last_day or lead_obtenue_le IS NULL) + and obtenue_le>(mb.last_day-interval '4 years') + and etoiles = '5') as etoile_5 from stats.monthly_bucket mb - join labellisation l on true +join l_details on true group by mb.first_day order by mb.first_day; -create view stats_evolution_nombre_labellisations -as -select * -from stats.evolution_nombre_labellisations; - +create view stats_evolution_nombre_labellisations as +SELECT mois, + etoile_1, + etoile_2, + etoile_3, + etoile_4, + etoile_5 +FROM stats.evolution_nombre_labellisations; create or replace function stats.refresh_views() diff --git a/data_layer/sqitch/deploy/stats/vues_BI@v2.106.0.sql b/data_layer/sqitch/deploy/stats/vues_BI@v2.106.0.sql new file mode 100644 index 0000000000..1e61a780b5 --- /dev/null +++ b/data_layer/sqitch/deploy/stats/vues_BI@v2.106.0.sql @@ -0,0 +1,117 @@ +-- Deploy tet:stats/vues_BI to pg + +BEGIN; + +-- evolution_collectivite_avec_minimum_fiches +drop view stats_evolution_collectivite_avec_minimum_fiches; +drop materialized view stats.evolution_collectivite_avec_minimum_fiches; + +create materialized view stats.evolution_collectivite_avec_minimum_fiches as +with fiche_collectivite as (select mb.first_day as mois, + ca.collectivite_id, + count(*) filter (where fa.created_at <= mb.last_day) as fiches + from stats.monthly_bucket mb + join stats.collectivite_active ca on true + join fiche_action fa using (collectivite_id) + group by mb.first_day, ca.collectivite_id) +select fiche_collectivite.mois, + count(*) filter (where fiche_collectivite.fiches > 5) as collectivites +from fiche_collectivite +group by fiche_collectivite.mois +order by fiche_collectivite.mois; + +create view stats_evolution_collectivite_avec_minimum_fiches +as +select * +from stats.evolution_collectivite_avec_minimum_fiches; + +-- evolution_nombre_fiches +drop view stats_evolution_nombre_fiches; +drop materialized view stats.evolution_nombre_fiches; + +create materialized view stats.evolution_nombre_fiches as +select mb.first_day as mois, + count(*) filter (where fa.created_at <= mb.last_day) as fiches +from stats.monthly_bucket mb + join stats.collectivite_active ca on true + join fiche_action fa using (collectivite_id) +group by mb.first_day +order by mb.first_day; + +create view stats_evolution_nombre_fiches +as +select * +from stats.evolution_nombre_fiches; + +create materialized view stats.evolution_nombre_plans +as +select mb.first_day as mois, + count(*) filter (where a.created_at <= mb.last_day) as plans +from stats.monthly_bucket mb + join stats.collectivite_active ca on true + join axe a using (collectivite_id) +where a.parent is null +group by mb.first_day +order by mb.first_day; + +create view stats_evolution_nombre_plans +as +select * +from stats.evolution_nombre_plans; + +-- évolution des labellisations +create materialized view stats.evolution_nombre_labellisations +as +select mb.first_day as mois, + count(*) filter (where l.obtenue_le <= mb.last_day and l.etoiles = '1') as etoile_1, + count(*) filter (where l.obtenue_le <= mb.last_day and l.etoiles = '2') as etoile_2, + count(*) filter (where l.obtenue_le <= mb.last_day and l.etoiles = '3') as etoile_3, + count(*) filter (where l.obtenue_le <= mb.last_day and l.etoiles = '4') as etoile_4, + count(*) filter (where l.obtenue_le <= mb.last_day and l.etoiles = '5') as etoile_5 +from stats.monthly_bucket mb + join labellisation l on true +group by mb.first_day +order by mb.first_day; + +create view stats_evolution_nombre_labellisations +as +select * +from stats.evolution_nombre_labellisations; + + +create or replace function + stats.refresh_views() + returns void +as +$$ +begin + refresh materialized view stats.collectivite; + refresh materialized view stats.collectivite_utilisateur; + refresh materialized view stats.collectivite_referentiel; + refresh materialized view stats.collectivite_labellisation; + refresh materialized view stats.collectivite_plan_action; + refresh materialized view stats.collectivite_action_statut; + refresh materialized view stats.evolution_activation; + refresh materialized view stats.rattachement; + refresh materialized view stats.utilisateur; + refresh materialized view stats.evolution_utilisateur; + refresh materialized view stats.connection; + refresh materialized view stats.evolution_connection; + refresh materialized view stats.carte_collectivite_active; + refresh materialized view stats.evolution_total_activation_par_type; + refresh materialized view stats.collectivite_actives_et_total_par_type; + refresh materialized view stats.evolution_nombre_utilisateur_par_collectivite; + refresh materialized view stats.carte_epci_par_departement; + refresh materialized view stats.pourcentage_completude; + refresh materialized view stats.evolution_collectivite_avec_minimum_fiches; + refresh materialized view stats.evolution_indicateur_referentiel; + refresh materialized view stats.evolution_resultat_indicateur_referentiel; + refresh materialized view stats.evolution_resultat_indicateur_personnalise; + refresh materialized view stats.engagement_collectivite; + refresh materialized view stats.evolution_nombre_fiches; + refresh materialized view stats.evolution_nombre_plans; + refresh materialized view stats.evolution_nombre_labellisations; +end ; +$$ language plpgsql security definer; + +COMMIT; diff --git a/data_layer/sqitch/revert/stats/locales.sql b/data_layer/sqitch/revert/stats/locales.sql index 55db964378..da786c6017 100644 --- a/data_layer/sqitch/revert/stats/locales.sql +++ b/data_layer/sqitch/revert/stats/locales.sql @@ -2,154 +2,111 @@ BEGIN; --- locales_evolution_collectivite_avec_minimum_fiches -drop view stats_locales_evolution_collectivite_avec_minimum_fiches; -drop materialized view stats.locales_evolution_collectivite_avec_minimum_fiches; - -create materialized view stats.locales_evolution_collectivite_avec_minimum_fiches as -WITH fiche_collectivite AS (SELECT mb.first_day AS mois, - c.collectivite_id, - c.region_code, - c.departement_code, - COALESCE(count(*) FILTER (WHERE fa.modified_at <= mb.last_day), 0::bigint) AS fiches - FROM stats.monthly_bucket mb - JOIN stats.collectivite c ON true - LEFT JOIN fiche_action fa USING (collectivite_id) - GROUP BY mb.first_day, c.collectivite_id, c.departement_code, c.region_code) -SELECT fiche_collectivite.mois, - NULL::character varying(2) AS code_region, - NULL::character varying(2) AS code_departement, - count(*) FILTER (WHERE fiche_collectivite.fiches > 5) AS collectivites -FROM fiche_collectivite -GROUP BY fiche_collectivite.mois -UNION ALL -SELECT fiche_collectivite.mois, - fiche_collectivite.region_code AS code_region, - NULL::character varying AS code_departement, - count(*) FILTER (WHERE fiche_collectivite.fiches > 5) AS collectivites -FROM fiche_collectivite -GROUP BY fiche_collectivite.mois, fiche_collectivite.region_code -UNION ALL -SELECT fiche_collectivite.mois, - NULL::character varying AS code_region, - fiche_collectivite.departement_code AS code_departement, - count(*) FILTER (WHERE fiche_collectivite.fiches > 5) AS collectivites -FROM fiche_collectivite -GROUP BY fiche_collectivite.mois, fiche_collectivite.departement_code -ORDER BY 1; - -create view stats_locales_evolution_collectivite_avec_minimum_fiches +create or replace function + stats.refresh_stats_locales() + returns void as -select * -from stats.locales_evolution_collectivite_avec_minimum_fiches; - - --- locales_evolution_nombre_fiches -drop view stats_locales_evolution_nombre_fiches; -drop materialized view stats.locales_evolution_nombre_fiches; - -create materialized view stats.locales_evolution_nombre_fiches as -SELECT mb.first_day AS mois, - NULL::character varying(2) AS code_region, - NULL::character varying(2) AS code_departement, - count(*) FILTER (WHERE fa.modified_at <= mb.last_day) AS fiches -FROM stats.monthly_bucket mb - JOIN stats.collectivite ca ON true - JOIN fiche_action fa USING (collectivite_id) -GROUP BY mb.first_day +$$ +begin + refresh materialized view stats.locales_evolution_total_activation; + refresh materialized view stats.locales_collectivite_actives_et_total_par_type; + refresh materialized view stats.locales_evolution_utilisateur; + refresh materialized view stats.locales_evolution_nombre_utilisateur_par_collectivite; + refresh materialized view stats.locales_pourcentage_completude; + refresh materialized view stats.locales_tranche_completude; + refresh materialized view stats.evolution_nombre_fiches; + refresh materialized view stats.locales_evolution_collectivite_avec_minimum_fiches; + refresh materialized view stats.locales_engagement_collectivite; + refresh materialized view stats.locales_evolution_indicateur_referentiel; + refresh materialized view stats.locales_evolution_resultat_indicateur_personnalise; + refresh materialized view stats.locales_evolution_resultat_indicateur_referentiel; + refresh materialized view stats.locales_evolution_nombre_fiches; + refresh materialized view stats.locales_evolution_collectivite_avec_indicateur_referentiel; +end +$$ language plpgsql; + +drop view stats_locales_labellisation_par_niveau; +drop materialized view stats.locales_labellisation_par_niveau; + +create materialized view stats.locales_labellisation_par_niveau as +WITH latest_labellisation AS ( + SELECT l.collectivite_id, + l.referentiel, + ( + SELECT ll.etoiles + FROM labellisation ll + WHERE ll.collectivite_id = l.collectivite_id + AND ll.referentiel = l.referentiel + ORDER BY ll.obtenue_le DESC + LIMIT 1 + ) AS etoiles + FROM labellisation l + GROUP BY l.collectivite_id, l.referentiel + ), + labellisation_locales AS ( + SELECT l.etoiles, + l.referentiel, + c.region_code, + c.departement_code + FROM latest_labellisation l + JOIN stats.collectivite c USING (collectivite_id) + ) +SELECT NULL::character varying(2) AS code_region, + NULL::character varying(2) AS code_departement, + labellisation_locales.referentiel, + labellisation_locales.etoiles, + count(*) AS labellisations +FROM labellisation_locales +GROUP BY labellisation_locales.referentiel, labellisation_locales.etoiles UNION ALL -SELECT mb.first_day AS mois, - ca.region_code AS code_region, - NULL::character varying AS code_departement, - count(*) FILTER (WHERE fa.modified_at <= mb.last_day) AS fiches -FROM stats.monthly_bucket mb - JOIN stats.collectivite ca ON true - LEFT JOIN fiche_action fa USING (collectivite_id) -GROUP BY mb.first_day, ca.region_code +SELECT r.code AS code_region, + NULL::character varying AS code_departement, + l.referentiel, + l.etoiles, + COALESCE(count(l.*), 0::bigint) AS labellisations +FROM imports.region r +JOIN labellisation_locales l ON l.region_code::text = r.code::text +GROUP BY l.referentiel, l.etoiles, r.code UNION ALL -SELECT mb.first_day AS mois, - NULL::character varying AS code_region, - ca.departement_code AS code_departement, - count(*) FILTER (WHERE fa.modified_at <= mb.last_day) AS fiches -FROM stats.monthly_bucket mb - JOIN stats.collectivite ca ON true - LEFT JOIN fiche_action fa USING (collectivite_id) -GROUP BY mb.first_day, ca.departement_code -ORDER BY 1; - -create view stats_locales_evolution_nombre_fiches -as -select * -from stats.locales_evolution_nombre_fiches; - -drop view stats_locales_evolution_total_activation; -drop materialized view stats.locales_evolution_total_activation; -create materialized view stats.locales_evolution_total_activation +SELECT NULL::character varying AS code_region, + d.code AS code_departement, + l.referentiel, + l.etoiles, + COALESCE(count(l.*), 0::bigint) AS labellisations +FROM imports.departement d +JOIN labellisation_locales l ON l.departement_code::text = d.code::text +GROUP BY l.referentiel, l.etoiles, d.code; + +create view stats_locales_labellisation_par_niveau as +SELECT code_region, + code_departement, + referentiel, + etoiles, + labellisations +FROM stats.locales_labellisation_par_niveau; + +create or replace function + stats.refresh_stats_locales() + returns void as -select -- permet de filtrer - m.first_day as mois, - null:: varchar(2) as code_region, - null::varchar(2) as code_departement, - - -- stats nationales - (select count(*) as count - from stats.collectivite_utilisateur cu - where cu.date_activation <= m.last_day) as total, - (select count(*) filter (where cu.type_collectivite = 'EPCI'::type_collectivite) as count - from stats.collectivite_utilisateur cu - where cu.date_activation <= m.last_day) as total_epci, - (select count(*) filter (where cu.type_collectivite = 'syndicat'::type_collectivite) as count - from stats.collectivite_utilisateur cu - where cu.date_activation <= m.last_day) as total_syndicat, - (select count(*) filter (where cu.type_collectivite = 'commune'::type_collectivite) as count - from stats.collectivite_utilisateur cu - where cu.date_activation <= m.last_day) as total_commune -from stats.monthly_bucket m - -union all - -select m.first_day as mois, - r.code, - null, - (select count(*) filter ( where cu.region_code = r.code) - from stats.collectivite_utilisateur cu - where cu.date_activation <= m.last_day), - (select count(*) filter ( where cu.type_collectivite = 'EPCI' and cu.region_code = r.code) - from stats.collectivite_utilisateur cu - where cu.date_activation <= m.last_day), - (select count(*) filter ( where cu.type_collectivite = 'syndicat' and cu.region_code = r.code) - from stats.collectivite_utilisateur cu - where cu.date_activation <= m.last_day), - (select count(*) filter ( where cu.type_collectivite = 'commune' and cu.region_code = r.code) - from stats.collectivite_utilisateur cu - where cu.date_activation <= m.last_day) - -from imports.region r - join stats.monthly_bucket m on true - -union all - -select m.first_day as mois, - null, - d.code, - (select count(*) filter ( where departement_code = d.code) - from stats.collectivite_utilisateur cu - where cu.date_activation <= m.last_day), - (select count(*) filter ( where cu.type_collectivite = 'EPCI' and departement_code = d.code) - from stats.collectivite_utilisateur cu - where cu.date_activation <= m.last_day), - (select count(*) filter ( where cu.type_collectivite = 'syndicat' and departement_code = d.code) - from stats.collectivite_utilisateur cu - where cu.date_activation <= m.last_day), - (select count(*) filter ( where cu.type_collectivite = 'commune' and departement_code = d.code) - from stats.collectivite_utilisateur cu - where cu.date_activation <= m.last_day) - -from imports.departement d - join stats.monthly_bucket m on true; - -create view stats_locales_evolution_total_activation as -select * -from stats.locales_evolution_total_activation; +$$ +begin + refresh materialized view stats.locales_evolution_total_activation; + refresh materialized view stats.locales_collectivite_actives_et_total_par_type; + refresh materialized view stats.locales_evolution_utilisateur; + refresh materialized view stats.locales_evolution_nombre_utilisateur_par_collectivite; + refresh materialized view stats.locales_pourcentage_completude; + refresh materialized view stats.locales_tranche_completude; + refresh materialized view stats.evolution_nombre_fiches; + refresh materialized view stats.locales_evolution_collectivite_avec_minimum_fiches; + refresh materialized view stats.locales_engagement_collectivite; + refresh materialized view stats.locales_labellisation_par_niveau; + refresh materialized view stats.locales_evolution_indicateur_referentiel; + refresh materialized view stats.locales_evolution_resultat_indicateur_personnalise; + refresh materialized view stats.locales_evolution_resultat_indicateur_referentiel; + refresh materialized view stats.locales_evolution_nombre_fiches; + refresh materialized view stats.locales_evolution_collectivite_avec_indicateur_referentiel; +end +$$ language plpgsql; COMMIT; diff --git a/data_layer/sqitch/revert/stats/locales@v2.106.0.sql b/data_layer/sqitch/revert/stats/locales@v2.106.0.sql new file mode 100644 index 0000000000..55db964378 --- /dev/null +++ b/data_layer/sqitch/revert/stats/locales@v2.106.0.sql @@ -0,0 +1,155 @@ +-- Deploy tet:stats/locale to pg + +BEGIN; + +-- locales_evolution_collectivite_avec_minimum_fiches +drop view stats_locales_evolution_collectivite_avec_minimum_fiches; +drop materialized view stats.locales_evolution_collectivite_avec_minimum_fiches; + +create materialized view stats.locales_evolution_collectivite_avec_minimum_fiches as +WITH fiche_collectivite AS (SELECT mb.first_day AS mois, + c.collectivite_id, + c.region_code, + c.departement_code, + COALESCE(count(*) FILTER (WHERE fa.modified_at <= mb.last_day), 0::bigint) AS fiches + FROM stats.monthly_bucket mb + JOIN stats.collectivite c ON true + LEFT JOIN fiche_action fa USING (collectivite_id) + GROUP BY mb.first_day, c.collectivite_id, c.departement_code, c.region_code) +SELECT fiche_collectivite.mois, + NULL::character varying(2) AS code_region, + NULL::character varying(2) AS code_departement, + count(*) FILTER (WHERE fiche_collectivite.fiches > 5) AS collectivites +FROM fiche_collectivite +GROUP BY fiche_collectivite.mois +UNION ALL +SELECT fiche_collectivite.mois, + fiche_collectivite.region_code AS code_region, + NULL::character varying AS code_departement, + count(*) FILTER (WHERE fiche_collectivite.fiches > 5) AS collectivites +FROM fiche_collectivite +GROUP BY fiche_collectivite.mois, fiche_collectivite.region_code +UNION ALL +SELECT fiche_collectivite.mois, + NULL::character varying AS code_region, + fiche_collectivite.departement_code AS code_departement, + count(*) FILTER (WHERE fiche_collectivite.fiches > 5) AS collectivites +FROM fiche_collectivite +GROUP BY fiche_collectivite.mois, fiche_collectivite.departement_code +ORDER BY 1; + +create view stats_locales_evolution_collectivite_avec_minimum_fiches +as +select * +from stats.locales_evolution_collectivite_avec_minimum_fiches; + + +-- locales_evolution_nombre_fiches +drop view stats_locales_evolution_nombre_fiches; +drop materialized view stats.locales_evolution_nombre_fiches; + +create materialized view stats.locales_evolution_nombre_fiches as +SELECT mb.first_day AS mois, + NULL::character varying(2) AS code_region, + NULL::character varying(2) AS code_departement, + count(*) FILTER (WHERE fa.modified_at <= mb.last_day) AS fiches +FROM stats.monthly_bucket mb + JOIN stats.collectivite ca ON true + JOIN fiche_action fa USING (collectivite_id) +GROUP BY mb.first_day +UNION ALL +SELECT mb.first_day AS mois, + ca.region_code AS code_region, + NULL::character varying AS code_departement, + count(*) FILTER (WHERE fa.modified_at <= mb.last_day) AS fiches +FROM stats.monthly_bucket mb + JOIN stats.collectivite ca ON true + LEFT JOIN fiche_action fa USING (collectivite_id) +GROUP BY mb.first_day, ca.region_code +UNION ALL +SELECT mb.first_day AS mois, + NULL::character varying AS code_region, + ca.departement_code AS code_departement, + count(*) FILTER (WHERE fa.modified_at <= mb.last_day) AS fiches +FROM stats.monthly_bucket mb + JOIN stats.collectivite ca ON true + LEFT JOIN fiche_action fa USING (collectivite_id) +GROUP BY mb.first_day, ca.departement_code +ORDER BY 1; + +create view stats_locales_evolution_nombre_fiches +as +select * +from stats.locales_evolution_nombre_fiches; + +drop view stats_locales_evolution_total_activation; +drop materialized view stats.locales_evolution_total_activation; +create materialized view stats.locales_evolution_total_activation +as +select -- permet de filtrer + m.first_day as mois, + null:: varchar(2) as code_region, + null::varchar(2) as code_departement, + + -- stats nationales + (select count(*) as count + from stats.collectivite_utilisateur cu + where cu.date_activation <= m.last_day) as total, + (select count(*) filter (where cu.type_collectivite = 'EPCI'::type_collectivite) as count + from stats.collectivite_utilisateur cu + where cu.date_activation <= m.last_day) as total_epci, + (select count(*) filter (where cu.type_collectivite = 'syndicat'::type_collectivite) as count + from stats.collectivite_utilisateur cu + where cu.date_activation <= m.last_day) as total_syndicat, + (select count(*) filter (where cu.type_collectivite = 'commune'::type_collectivite) as count + from stats.collectivite_utilisateur cu + where cu.date_activation <= m.last_day) as total_commune +from stats.monthly_bucket m + +union all + +select m.first_day as mois, + r.code, + null, + (select count(*) filter ( where cu.region_code = r.code) + from stats.collectivite_utilisateur cu + where cu.date_activation <= m.last_day), + (select count(*) filter ( where cu.type_collectivite = 'EPCI' and cu.region_code = r.code) + from stats.collectivite_utilisateur cu + where cu.date_activation <= m.last_day), + (select count(*) filter ( where cu.type_collectivite = 'syndicat' and cu.region_code = r.code) + from stats.collectivite_utilisateur cu + where cu.date_activation <= m.last_day), + (select count(*) filter ( where cu.type_collectivite = 'commune' and cu.region_code = r.code) + from stats.collectivite_utilisateur cu + where cu.date_activation <= m.last_day) + +from imports.region r + join stats.monthly_bucket m on true + +union all + +select m.first_day as mois, + null, + d.code, + (select count(*) filter ( where departement_code = d.code) + from stats.collectivite_utilisateur cu + where cu.date_activation <= m.last_day), + (select count(*) filter ( where cu.type_collectivite = 'EPCI' and departement_code = d.code) + from stats.collectivite_utilisateur cu + where cu.date_activation <= m.last_day), + (select count(*) filter ( where cu.type_collectivite = 'syndicat' and departement_code = d.code) + from stats.collectivite_utilisateur cu + where cu.date_activation <= m.last_day), + (select count(*) filter ( where cu.type_collectivite = 'commune' and departement_code = d.code) + from stats.collectivite_utilisateur cu + where cu.date_activation <= m.last_day) + +from imports.departement d + join stats.monthly_bucket m on true; + +create view stats_locales_evolution_total_activation as +select * +from stats.locales_evolution_total_activation; + +COMMIT; diff --git a/data_layer/sqitch/revert/stats/vues_BI.sql b/data_layer/sqitch/revert/stats/vues_BI.sql index df10c03af5..ab9ceb2959 100644 --- a/data_layer/sqitch/revert/stats/vues_BI.sql +++ b/data_layer/sqitch/revert/stats/vues_BI.sql @@ -2,52 +2,63 @@ BEGIN; -drop view stats_evolution_nombre_labellisations; -drop materialized view stats.evolution_nombre_labellisations; - -drop view stats_evolution_nombre_plans; -drop materialized view stats.evolution_nombre_plans; - --- evolution_collectivite_avec_minimum_fiches -drop view stats_evolution_collectivite_avec_minimum_fiches; -drop materialized view stats.evolution_collectivite_avec_minimum_fiches; - -create materialized view stats.evolution_collectivite_avec_minimum_fiches as -WITH fiche_collecticite AS (SELECT mb.first_day AS mois, - ca.collectivite_id, - count(*) FILTER (WHERE fa.modified_at <= mb.last_day) AS fiches - FROM stats.monthly_bucket mb - JOIN stats.collectivite_active ca ON true - JOIN fiche_action fa USING (collectivite_id) - GROUP BY mb.first_day, ca.collectivite_id) -SELECT fiche_collecticite.mois, - count(*) FILTER (WHERE fiche_collecticite.fiches > 5) AS collectivites -FROM fiche_collecticite -GROUP BY fiche_collecticite.mois -ORDER BY fiche_collecticite.mois; - -create view stats_evolution_collectivite_avec_minimum_fiches +create or replace function + stats.refresh_views() + returns void as -select * -from stats.evolution_collectivite_avec_minimum_fiches; +$$ +begin + refresh materialized view stats.collectivite; + refresh materialized view stats.collectivite_utilisateur; + refresh materialized view stats.collectivite_referentiel; + refresh materialized view stats.collectivite_labellisation; + refresh materialized view stats.collectivite_plan_action; + refresh materialized view stats.collectivite_action_statut; + refresh materialized view stats.evolution_activation; + refresh materialized view stats.rattachement; + refresh materialized view stats.utilisateur; + refresh materialized view stats.evolution_utilisateur; + refresh materialized view stats.connection; + refresh materialized view stats.evolution_connection; + refresh materialized view stats.carte_collectivite_active; + refresh materialized view stats.evolution_total_activation_par_type; + refresh materialized view stats.collectivite_actives_et_total_par_type; + refresh materialized view stats.evolution_nombre_utilisateur_par_collectivite; + refresh materialized view stats.carte_epci_par_departement; + refresh materialized view stats.pourcentage_completude; + refresh materialized view stats.evolution_collectivite_avec_minimum_fiches; + refresh materialized view stats.evolution_indicateur_referentiel; + refresh materialized view stats.evolution_resultat_indicateur_referentiel; + refresh materialized view stats.evolution_resultat_indicateur_personnalise; + refresh materialized view stats.engagement_collectivite; + refresh materialized view stats.evolution_nombre_fiches; + refresh materialized view stats.evolution_nombre_plans; +end ; +$$ language plpgsql security definer; --- evolution_nombre_fiches -drop view stats_evolution_nombre_fiches; -drop materialized view stats.evolution_nombre_fiches; +drop view stats_evolution_nombre_labellisations; +drop materialized view stats.evolution_nombre_labellisations; -create materialized view stats.evolution_nombre_fiches as -SELECT mb.first_day AS mois, - count(*) FILTER (WHERE fa.modified_at <= mb.last_day) AS fiches +create materialized view stats.evolution_nombre_labellisations as +SELECT mb.first_day AS mois, + count(*) FILTER (WHERE l.obtenue_le <= mb.last_day AND l.etoiles = 1) AS etoile_1, + count(*) FILTER (WHERE l.obtenue_le <= mb.last_day AND l.etoiles = 2) AS etoile_2, + count(*) FILTER (WHERE l.obtenue_le <= mb.last_day AND l.etoiles = 3) AS etoile_3, + count(*) FILTER (WHERE l.obtenue_le <= mb.last_day AND l.etoiles = 4) AS etoile_4, + count(*) FILTER (WHERE l.obtenue_le <= mb.last_day AND l.etoiles = 5) AS etoile_5 FROM stats.monthly_bucket mb - JOIN stats.collectivite_active ca ON true - JOIN fiche_action fa USING (collectivite_id) +JOIN labellisation l ON true GROUP BY mb.first_day ORDER BY mb.first_day; -create view stats_evolution_nombre_fiches -as -select * -from stats.evolution_nombre_fiches; +create view stats_evolution_nombre_labellisations as +SELECT mois, + etoile_1, + etoile_2, + etoile_3, + etoile_4, + etoile_5 +FROM stats.evolution_nombre_labellisations; create or replace function stats.refresh_views() @@ -79,6 +90,8 @@ begin refresh materialized view stats.evolution_resultat_indicateur_personnalise; refresh materialized view stats.engagement_collectivite; refresh materialized view stats.evolution_nombre_fiches; + refresh materialized view stats.evolution_nombre_plans; + refresh materialized view stats.evolution_nombre_labellisations; end ; $$ language plpgsql security definer; diff --git a/data_layer/sqitch/revert/stats/vues_BI@v2.106.0.sql b/data_layer/sqitch/revert/stats/vues_BI@v2.106.0.sql new file mode 100644 index 0000000000..df10c03af5 --- /dev/null +++ b/data_layer/sqitch/revert/stats/vues_BI@v2.106.0.sql @@ -0,0 +1,85 @@ +-- Deploy tet:stats/vues_BI to pg + +BEGIN; + +drop view stats_evolution_nombre_labellisations; +drop materialized view stats.evolution_nombre_labellisations; + +drop view stats_evolution_nombre_plans; +drop materialized view stats.evolution_nombre_plans; + +-- evolution_collectivite_avec_minimum_fiches +drop view stats_evolution_collectivite_avec_minimum_fiches; +drop materialized view stats.evolution_collectivite_avec_minimum_fiches; + +create materialized view stats.evolution_collectivite_avec_minimum_fiches as +WITH fiche_collecticite AS (SELECT mb.first_day AS mois, + ca.collectivite_id, + count(*) FILTER (WHERE fa.modified_at <= mb.last_day) AS fiches + FROM stats.monthly_bucket mb + JOIN stats.collectivite_active ca ON true + JOIN fiche_action fa USING (collectivite_id) + GROUP BY mb.first_day, ca.collectivite_id) +SELECT fiche_collecticite.mois, + count(*) FILTER (WHERE fiche_collecticite.fiches > 5) AS collectivites +FROM fiche_collecticite +GROUP BY fiche_collecticite.mois +ORDER BY fiche_collecticite.mois; + +create view stats_evolution_collectivite_avec_minimum_fiches +as +select * +from stats.evolution_collectivite_avec_minimum_fiches; + +-- evolution_nombre_fiches +drop view stats_evolution_nombre_fiches; +drop materialized view stats.evolution_nombre_fiches; + +create materialized view stats.evolution_nombre_fiches as +SELECT mb.first_day AS mois, + count(*) FILTER (WHERE fa.modified_at <= mb.last_day) AS fiches +FROM stats.monthly_bucket mb + JOIN stats.collectivite_active ca ON true + JOIN fiche_action fa USING (collectivite_id) +GROUP BY mb.first_day +ORDER BY mb.first_day; + +create view stats_evolution_nombre_fiches +as +select * +from stats.evolution_nombre_fiches; + +create or replace function + stats.refresh_views() + returns void +as +$$ +begin + refresh materialized view stats.collectivite; + refresh materialized view stats.collectivite_utilisateur; + refresh materialized view stats.collectivite_referentiel; + refresh materialized view stats.collectivite_labellisation; + refresh materialized view stats.collectivite_plan_action; + refresh materialized view stats.collectivite_action_statut; + refresh materialized view stats.evolution_activation; + refresh materialized view stats.rattachement; + refresh materialized view stats.utilisateur; + refresh materialized view stats.evolution_utilisateur; + refresh materialized view stats.connection; + refresh materialized view stats.evolution_connection; + refresh materialized view stats.carte_collectivite_active; + refresh materialized view stats.evolution_total_activation_par_type; + refresh materialized view stats.collectivite_actives_et_total_par_type; + refresh materialized view stats.evolution_nombre_utilisateur_par_collectivite; + refresh materialized view stats.carte_epci_par_departement; + refresh materialized view stats.pourcentage_completude; + refresh materialized view stats.evolution_collectivite_avec_minimum_fiches; + refresh materialized view stats.evolution_indicateur_referentiel; + refresh materialized view stats.evolution_resultat_indicateur_referentiel; + refresh materialized view stats.evolution_resultat_indicateur_personnalise; + refresh materialized view stats.engagement_collectivite; + refresh materialized view stats.evolution_nombre_fiches; +end ; +$$ language plpgsql security definer; + +COMMIT; diff --git a/data_layer/sqitch/sqitch.plan b/data_layer/sqitch/sqitch.plan index 7cd34d1bc1..2d5e4f2764 100644 --- a/data_layer/sqitch/sqitch.plan +++ b/data_layer/sqitch/sqitch.plan @@ -645,3 +645,5 @@ indicateur/global 2024-04-10T10:00:31Z Amandine Jacquelin # M referentiel/vue_tabulaire [referentiel/vue_tabulaire@v2.102.0] 2024-03-12T18:05:45Z Amandine Jacquelin # Corrige la vue action_statuts pour ne pas inclure les avancements descendants quand un parent est non concerne ou desactive @v2.106.0 2024-04-18T07:48:50Z Amandine Jacquelin # Correction du filtre non renseigné sur la vue action_statuts +stats/locales [stats/locales@v2.106.0] 2024-04-22T16:38:13Z Amandine Jacquelin # Corrige le count des étoiles de la vue stats.locales_labellisation_par_niveau +stats/vues_BI [stats/vues_BI@v2.106.0] 2024-04-22T16:39:26Z Amandine Jacquelin # Corrige le count des étoiles de la vue stats.evolution_nombre_labellisations diff --git a/data_layer/sqitch/verify/stats/locales.sql b/data_layer/sqitch/verify/stats/locales.sql index d725a67b41..6c795202cc 100644 --- a/data_layer/sqitch/verify/stats/locales.sql +++ b/data_layer/sqitch/verify/stats/locales.sql @@ -2,20 +2,20 @@ BEGIN; -select mois, code_region, code_departement, collectivites -from stats.locales_evolution_collectivite_avec_minimum_fiches +select code_region, + code_departement, + referentiel, + etoiles, + labellisations +from stats.locales_labellisation_par_niveau where false; -select mois, code_region, code_departement, collectivites -from stats_locales_evolution_collectivite_avec_minimum_fiches -where false; - -select mois, code_region, code_departement, fiches -from stats.locales_evolution_nombre_fiches -where false; - -select mois, code_region, code_departement, fiches -from stats_locales_evolution_nombre_fiches +select code_region, + code_departement, + referentiel, + etoiles, + labellisations +from stats_locales_labellisation_par_niveau where false; ROLLBACK; diff --git a/data_layer/sqitch/verify/stats/locales@v2.106.0.sql b/data_layer/sqitch/verify/stats/locales@v2.106.0.sql new file mode 100644 index 0000000000..d725a67b41 --- /dev/null +++ b/data_layer/sqitch/verify/stats/locales@v2.106.0.sql @@ -0,0 +1,21 @@ +-- Verify tet:stats/locale on pg + +BEGIN; + +select mois, code_region, code_departement, collectivites +from stats.locales_evolution_collectivite_avec_minimum_fiches +where false; + +select mois, code_region, code_departement, collectivites +from stats_locales_evolution_collectivite_avec_minimum_fiches +where false; + +select mois, code_region, code_departement, fiches +from stats.locales_evolution_nombre_fiches +where false; + +select mois, code_region, code_departement, fiches +from stats_locales_evolution_nombre_fiches +where false; + +ROLLBACK; diff --git a/data_layer/sqitch/verify/stats/vues_BI.sql b/data_layer/sqitch/verify/stats/vues_BI.sql index f1ca16dcfe..55f0a05526 100644 --- a/data_layer/sqitch/verify/stats/vues_BI.sql +++ b/data_layer/sqitch/verify/stats/vues_BI.sql @@ -2,20 +2,23 @@ BEGIN; -select mois, collectivites -from stats.evolution_collectivite_avec_minimum_fiches +select mois, + etoile_1, + etoile_2, + etoile_3, + etoile_4, + etoile_5 +from stats.evolution_nombre_labellisations where false; -select mois, collectivites -from stats_evolution_collectivite_avec_minimum_fiches -where false; - -select mois, fiches -from stats.evolution_nombre_fiches -where false; +select mois, + etoile_1, + etoile_2, + etoile_3, + etoile_4, + etoile_5 +from stats_evolution_nombre_labellisations -select mois, fiches -from stats_evolution_nombre_fiches where false; ROLLBACK; diff --git a/data_layer/sqitch/verify/stats/vues_BI@v2.106.0.sql b/data_layer/sqitch/verify/stats/vues_BI@v2.106.0.sql new file mode 100644 index 0000000000..f1ca16dcfe --- /dev/null +++ b/data_layer/sqitch/verify/stats/vues_BI@v2.106.0.sql @@ -0,0 +1,21 @@ +-- Verify tet:stats/vues_BI on pg + +BEGIN; + +select mois, collectivites +from stats.evolution_collectivite_avec_minimum_fiches +where false; + +select mois, collectivites +from stats_evolution_collectivite_avec_minimum_fiches +where false; + +select mois, fiches +from stats.evolution_nombre_fiches +where false; + +select mois, fiches +from stats_evolution_nombre_fiches +where false; + +ROLLBACK;