Skip to content
5 changes: 2 additions & 3 deletions .sqlfluff
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
[sqlfluff]
dialect = duckdb


dialect = duckdb
max_line_length = 100
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
version: 1

models:
- name: int__resultats_metabolite_specifique_udi_dernier
description: "Résultats des derniers prélèvements pour les métabolites de pesticides spécifiques par UDI."
tests:
- dbt_utils.unique_combination_of_columns:
combination_of_columns:
- cdreseau
- categorie
columns:
- name: cdreseau
description: "Code de l'installation (UDI)."
tests:
- not_null

- name: categorie
description: "Catégorie du métabolite analysé."
tests:
- accepted_values:
values:
- "metabolite_esa_metolachlore"
- "metabolite_chlorothalonil_r471811"
- "metabolite_chloridazone_desphenyl"
- "metabolite_chloridazone_methyl_desphenyl"
- "metabolite_atrazine_desethyl"

- name: dernier_prel_datetime
description: "Date et heure du dernier prélèvement pris en compte dans l'analyse."
type: TIMESTAMP
tests:
- not_null
- dbt_utils.expression_is_true:
expression: ">= CURRENT_DATE - INTERVAL 1 YEAR"

- name: resultat
description: "Interprétation du résultat en fonction des seuils sanitaires et des valeurs mesurées."
type: VARCHAR
tests:
- accepted_values:
values:
- "non_quantifie"
- "inf_limite_qualite"
- "sup_limite_qualite"
- "inf_limite_qualite_sup_0_1"
- "sup_valeur_sanitaire"

- name: periode
description: "Période d'analyse des prélèvements (ici, toujours 'dernier_prel')."
type: VARCHAR
tests:
- accepted_values:
values: ["dernier_prel"]
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
--------------------------------------------------------------
-- Tous les autres métabolites que ceux utilisés -
-- dans int__resultats_metabolite_specifique_udi_dernier.sql -
--------------------------------------------------------------

WITH autres_metabolites_results AS (
SELECT *
FROM {{ ref('int__resultats_udi_communes') }}
WHERE
categorie = 'pesticide'
AND
categorie_2 = 'metabolite'
AND
cdparametresiseeaux NOT IN (
'ESAMTC',
'MTCESA',
'471811R',
'R471811',
'CLDZ_D',
'CLDZ_MD',
'ADET'
)
AND
-- On garde les prélèvements de moins d'un an
CURRENT_DATE - datetimeprel < INTERVAL 1 YEAR
),

latest_datetimeprel_by_cdreseau AS (
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On ne peut pas fusionner le calcule de latest_datetimeprel_by_cdreseau et latest_referenceprel_results ?

J'ai l'impression que dans les deux cas c'est un MAX GROUP BY cdreseau, sur la même table

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On veut pour chaque cdreseau le referenceprel qui a le datetimeprel le plus récent. Peut-être qu'on peiut faire ça avec une window function mais on aura quand même besoin de deux CTEs pour faire le where row number = 1, non ?

Tu vois une façon de faire ça en une seule CTE ? Si oui, je prends!

Copy link
Collaborator

@20k-P 20k-P Apr 13, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Est -ce que quelque chose du genre pourrait aller ?

-- latest_by_cdreseau AS (
    SELECT DISTINCT
        cdreseau,
        LAST(datetimeprel) OVER ( PARTITION BY cdreseau ORDER BY datetimeprel DESC/ASC) AS max_datetimeprel,
        LAST(referenceprel) OVER ( PARTITION BY cdreseau ORDER BY datetimeprel DESC/ASC) AS referenceprel
    FROM autres_metabolites_results
  -- )

J'ai un doute sur DESC/ASC

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hum, je pense que les valeurs retournées par LAST(datetimeprel) et LAST(referenceprel) ne proviennent pas nécessairement de la même ligne d'origine. Chaque fonction LAST() est évaluée indépendamment et du coup on peut avoir une referenceprel qui n'est pas lié à la même datetimeprel.

SELECT
cdreseau,
MAX(datetimeprel) AS max_datetimeprel
FROM autres_metabolites_results
GROUP BY cdreseau
),

latest_referenceprel_results AS (
SELECT
r.cdreseau,
MAX(r.referenceprel) AS referenceprel
FROM autres_metabolites_results AS r
INNER JOIN latest_datetimeprel_by_cdreseau AS latest
ON
r.cdreseau = latest.cdreseau
AND r.datetimeprel = latest.max_datetimeprel
GROUP BY r.cdreseau
),

latest_autres_metabolites_results AS (
-- latest_autres_metabolites_results contient, pour chaque cdreseau,
-- les prélèvements du dernier referenceprel
SELECT r.*
FROM autres_metabolites_results AS r
INNER JOIN latest_referenceprel_results AS latest
ON
r.cdreseau = latest.cdreseau
AND
r.referenceprel = latest.referenceprel
)



SELECT
cdreseau,
'metabolite_divers' AS categorie,
'dernier_prel' AS periode,
MAX(datetimeprel) AS dernier_prel_datetime,
CASE
WHEN
BOOL_AND(valtraduite IS NULL OR valtraduite = 0)
THEN 'aucun_parametre_quantifie'
WHEN BOOL_OR(valeur_sanitaire_1 IS NOT NULL AND valtraduite >= valeur_sanitaire_1)
THEN 'sup_valeur_sanitaire'
WHEN
-- au moins 1 métabolite pertinent ou pertinent par défaut > 0,1 µg/L
BOOL_OR(
CASE
WHEN categorie_3 = 'pertinent' OR categorie_3 = 'pertinent_par_defaut'
THEN valtraduite >= limite_qualite
ELSE FALSE
END
)
OR
-- la somme des métabolites pertinents et pertinents par défaut > 0,5 µg/L
SUM(
CASE
WHEN
categorie_3 = 'pertinent' OR categorie_3 = 'pertinent_par_defaut'
THEN valtraduite
ELSE 0
END
) >= 0.5
OR
-- au moins 1 métabolite non pertinent > 0,9 µg/L
BOOL_OR(
CASE
WHEN
categorie_3 = 'non_pertinent'
THEN valtraduite >= 0.9
ELSE FALSE
END
)
THEN 'sup_limite_qualite'
WHEN
-- tous les métabolites pertinents ou pertinents par défaut < 0,1 µg/L
BOOL_AND(
CASE
WHEN
categorie_3 = 'pertinent' OR categorie_3 = 'pertinent_par_defaut'
THEN valtraduite < limite_qualite
ELSE
-- on ne s'intéresse pas à ces cas, donc on retourne
-- TRUE pour ne pas bloquer la condition BOOL_AND
TRUE
END
)
AND
-- la somme des métabolites pertinents et pertinents par défaut < 0,5 µg/L
SUM(
CASE
WHEN
categorie_3 = 'pertinent' OR categorie_3 = 'pertinent_par_defaut'
THEN valtraduite
ELSE 0
END
) < 0.5
AND
-- tous les métabolites non pertinents < 0.9 µg/L
BOOL_AND(
CASE
WHEN
categorie_3 = 'non_pertinent'
THEN valtraduite < 0.9
ELSE
-- on ne s'intéresse pas à ces cas, donc on retourne
-- TRUE pour ne pas bloquer la condition BOOL_AND
TRUE
END
)
THEN 'inf_limite_qualite'
ELSE 'erreur'
END AS resultat

FROM latest_autres_metabolites_results
GROUP BY cdreseau
Loading