diff --git a/analytics/notebooks/Test_depassements_no2vsno3.ipynb b/analytics/notebooks/Test_depassements_no2vsno3.ipynb
new file mode 100644
index 00000000..82e4bfa0
--- /dev/null
+++ b/analytics/notebooks/Test_depassements_no2vsno3.ipynb
@@ -0,0 +1,360 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "443a3c28-b272-4788-9995-0bcadc959d15",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The sql extension is already loaded. To reload it, use:\n",
+ " %reload_ext sql\n"
+ ]
+ }
+ ],
+ "source": [
+ "%load_ext sql\n",
+ "%sql duckdb:///../../database/data.duckdb\n",
+ "%config SqlMagic.named_parameters=\"enabled\" "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "id": "33985e98-d332-40dc-9038-4bd998e5567d",
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "Running query in 'duckdb:///../../database/data.duckdb'"
+ ],
+ "text/plain": [
+ "Running query in 'duckdb:///../../database/data.duckdb'"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "6b6b6d2428cc474fadf32706ae5d5f72",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "FloatProgress(value=0.0, layout=Layout(width='auto'), style=ProgressStyle(bar_color='black'))"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ " \n",
+ " \n",
+ " annee | \n",
+ " nb_prelevements | \n",
+ " nb_dep_3critères | \n",
+ " percent_3critères | \n",
+ " nb_prelevements_n02 | \n",
+ " nb_dep_n02 | \n",
+ " percent_n02 | \n",
+ " nb_prelevements_n03 | \n",
+ " nb_dep_n03 | \n",
+ " percent_n03 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 2020 | \n",
+ " 129386 | \n",
+ " 1745 | \n",
+ " 1.0 | \n",
+ " 129385 | \n",
+ " 27 | \n",
+ " 0.0 | \n",
+ " 129381 | \n",
+ " 1703 | \n",
+ " 1.0 | \n",
+ "
\n",
+ " \n",
+ " 2025 | \n",
+ " 18138 | \n",
+ " 285 | \n",
+ " 1.0 | \n",
+ " 18138 | \n",
+ " 1 | \n",
+ " 0.0 | \n",
+ " 17681 | \n",
+ " 283 | \n",
+ " 1.0 | \n",
+ "
\n",
+ " \n",
+ " 2021 | \n",
+ " 126493 | \n",
+ " 1823 | \n",
+ " 1.0 | \n",
+ " 126487 | \n",
+ " 17 | \n",
+ " 0.0 | \n",
+ " 126490 | \n",
+ " 1802 | \n",
+ " 1.0 | \n",
+ "
\n",
+ " \n",
+ " 2022 | \n",
+ " 128745 | \n",
+ " 1605 | \n",
+ " 1.0 | \n",
+ " 128736 | \n",
+ " 16 | \n",
+ " 0.0 | \n",
+ " 128737 | \n",
+ " 1586 | \n",
+ " 1.0 | \n",
+ "
\n",
+ " \n",
+ " 2024 | \n",
+ " 127734 | \n",
+ " 1980 | \n",
+ " 1.0 | \n",
+ " 127733 | \n",
+ " 16 | \n",
+ " 0.0 | \n",
+ " 127733 | \n",
+ " 1960 | \n",
+ " 1.0 | \n",
+ "
\n",
+ " \n",
+ " 2023 | \n",
+ " 129172 | \n",
+ " 1447 | \n",
+ " 1.0 | \n",
+ " 129171 | \n",
+ " 35 | \n",
+ " 0.0 | \n",
+ " 129154 | \n",
+ " 1405 | \n",
+ " 1.0 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ "+-------+-----------------+------------------+-------------------+---------------------+------------+-------------+---------------------+------------+-------------+\n",
+ "| annee | nb_prelevements | nb_dep_3critères | percent_3critères | nb_prelevements_n02 | nb_dep_n02 | percent_n02 | nb_prelevements_n03 | nb_dep_n03 | percent_n03 |\n",
+ "+-------+-----------------+------------------+-------------------+---------------------+------------+-------------+---------------------+------------+-------------+\n",
+ "| 2020 | 129386 | 1745 | 1.0 | 129385 | 27 | 0.0 | 129381 | 1703 | 1.0 |\n",
+ "| 2025 | 18138 | 285 | 1.0 | 18138 | 1 | 0.0 | 17681 | 283 | 1.0 |\n",
+ "| 2021 | 126493 | 1823 | 1.0 | 126487 | 17 | 0.0 | 126490 | 1802 | 1.0 |\n",
+ "| 2022 | 128745 | 1605 | 1.0 | 128736 | 16 | 0.0 | 128737 | 1586 | 1.0 |\n",
+ "| 2024 | 127734 | 1980 | 1.0 | 127733 | 16 | 0.0 | 127733 | 1960 | 1.0 |\n",
+ "| 2023 | 129172 | 1447 | 1.0 | 129171 | 35 | 0.0 | 129154 | 1405 | 1.0 |\n",
+ "+-------+-----------------+------------------+-------------------+---------------------+------------+-------------+---------------------+------------+-------------+"
+ ]
+ },
+ "execution_count": 19,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "%%sql\n",
+ "WITH\n",
+ "prels AS (\n",
+ " SELECT\n",
+ " de_partition AS annee,\n",
+ " cdreseau,\n",
+ " referenceprel,\n",
+ " datetimeprel,\n",
+ " COUNT(DISTINCT cdparametresiseeaux) AS nb_parametres,\n",
+ " MAX(\n",
+ " CASE\n",
+ " WHEN\n",
+ " cdparametresiseeaux = 'NO3'\n",
+ " THEN valtraduite\n",
+ " ELSE 0\n",
+ " END\n",
+ " ) AS valtraduite_no3,\n",
+ " MAX(\n",
+ " CASE\n",
+ " WHEN\n",
+ " cdparametresiseeaux = 'NO2'\n",
+ " THEN valtraduite\n",
+ " ELSE 0\n",
+ " END\n",
+ " ) AS valtraduite_no2,\n",
+ " MAX(\n",
+ " CASE\n",
+ " WHEN\n",
+ " cdparametresiseeaux = 'NO3_NO2'\n",
+ " THEN valtraduite\n",
+ " ELSE 0\n",
+ " END\n",
+ " ) AS valtraduite_no3_no2\n",
+ " FROM\n",
+ " int__resultats_udi_communes\n",
+ " WHERE\n",
+ " categorie = 'nitrate'\n",
+ " GROUP BY\n",
+ " annee,\n",
+ " cdreseau,\n",
+ " referenceprel,\n",
+ " datetimeprel,\n",
+ "),\n",
+ "\n",
+ "valeur_ref AS (\n",
+ " SELECT\n",
+ " MAX(\n",
+ " CASE\n",
+ " WHEN\n",
+ " cdparametresiseeaux = 'NO3'\n",
+ " THEN limite_qualite\n",
+ " END\n",
+ " ) AS limite_qualite_no3,\n",
+ " MAX(\n",
+ " CASE\n",
+ " WHEN\n",
+ " cdparametresiseeaux = 'NO3_NO2'\n",
+ " THEN limite_qualite\n",
+ " END\n",
+ " ) AS limite_qualite_no3_no2,\n",
+ " MAX(\n",
+ " CASE\n",
+ " WHEN\n",
+ " cdparametresiseeaux = 'NO2'\n",
+ " THEN limite_qualite\n",
+ " END\n",
+ " ) AS limite_qualite_no2\n",
+ " FROM\n",
+ " int__valeurs_de_reference\n",
+ " WHERE\n",
+ " categorie_1 = 'nitrate'\n",
+ ")\n",
+ "\n",
+ "SELECT\n",
+ " -- prels.cdreseau,\n",
+ " prels.annee,\n",
+ " -- 'nitrate' AS categorie,\n",
+ " -- 'bilan_annuel_' || prels.annee AS periode,\n",
+ " COUNT(DISTINCT prels.referenceprel) AS nb_prelevements,\n",
+ " COUNT(\n",
+ " DISTINCT\n",
+ " CASE\n",
+ " WHEN\n",
+ " prels.valtraduite_no3 >= valeur_ref.limite_qualite_no3\n",
+ " OR prels.valtraduite_no2 >= valeur_ref.limite_qualite_no2\n",
+ " OR prels.valtraduite_no3_no2\n",
+ " >= valeur_ref.limite_qualite_no3_no2\n",
+ " OR prels.valtraduite_no3 / 50 + prels.valtraduite_no2 / 3\n",
+ " >= valeur_ref.limite_qualite_no3_no2\n",
+ " THEN prels.referenceprel\n",
+ " END\n",
+ " ) AS nb_dep_3critères,\n",
+ " trunc((\n",
+ " COUNT(\n",
+ " DISTINCT\n",
+ " CASE\n",
+ " WHEN\n",
+ " prels.valtraduite_no3 >= valeur_ref.limite_qualite_no3\n",
+ " OR prels.valtraduite_no2 >= valeur_ref.limite_qualite_no2\n",
+ " OR prels.valtraduite_no3_no2\n",
+ " >= valeur_ref.limite_qualite_no3_no2\n",
+ " OR prels.valtraduite_no3 / 50 + prels.valtraduite_no2 / 3\n",
+ " >= valeur_ref.limite_qualite_no3_no2\n",
+ " THEN prels.referenceprel\n",
+ " END\n",
+ " )::float\n",
+ " /\n",
+ " COUNT(DISTINCT prels.referenceprel)::float\n",
+ " )*100) AS percent_3critères,\n",
+ "\n",
+ " COUNT(DISTINCT CASE WHEN valtraduite_no2 IS NOT NULL THEN prels.referenceprel END) AS nb_prelevements_n02,\n",
+ " COUNT(\n",
+ " DISTINCT\n",
+ " CASE\n",
+ " WHEN\n",
+ " prels.valtraduite_no2 >= valeur_ref.limite_qualite_no2\n",
+ " THEN prels.referenceprel\n",
+ " END\n",
+ " ) AS nb_dep_n02,\n",
+ " trunc((\n",
+ " COUNT(\n",
+ " DISTINCT\n",
+ " CASE\n",
+ " WHEN\n",
+ " prels.valtraduite_no2 >= valeur_ref.limite_qualite_no2\n",
+ " THEN prels.referenceprel\n",
+ " END\n",
+ " )::float\n",
+ " /\n",
+ " COUNT(DISTINCT CASE WHEN valtraduite_no2 IS NOT NULL THEN prels.referenceprel END)::float\n",
+ " )*100) AS percent_n02,\n",
+ "\n",
+ " COUNT(DISTINCT CASE WHEN valtraduite_no3 IS NOT NULL THEN prels.referenceprel END) AS nb_prelevements_n03,\n",
+ " COUNT(\n",
+ " DISTINCT\n",
+ " CASE\n",
+ " WHEN\n",
+ " prels.valtraduite_no3 >= valeur_ref.limite_qualite_no3\n",
+ " THEN prels.referenceprel\n",
+ " END\n",
+ " ) AS nb_dep_n03,\n",
+ " trunc((\n",
+ " COUNT(\n",
+ " DISTINCT\n",
+ " CASE\n",
+ " WHEN\n",
+ " prels.valtraduite_no3 >= valeur_ref.limite_qualite_no3\n",
+ " THEN prels.referenceprel\n",
+ " END\n",
+ " )::float\n",
+ " /\n",
+ " COUNT(DISTINCT CASE WHEN valtraduite_no2 IS NOT NULL THEN prels.referenceprel END)::float\n",
+ " )*100) AS percent_n03\n",
+ "\n",
+ "FROM prels\n",
+ "CROSS JOIN valeur_ref\n",
+ "GROUP BY /*prels.cdreseau,*/ prels.annee\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "d2b49cfb-e586-4523-991e-41a25a7d7b02",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.12.9"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/analytics/notebooks/resultats_nitrates.ipynb b/analytics/notebooks/resultats_nitrates.ipynb
new file mode 100644
index 00000000..4f414145
--- /dev/null
+++ b/analytics/notebooks/resultats_nitrates.ipynb
@@ -0,0 +1,1735 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "2e8d5bd2-d7c1-4ecb-805d-27eaa75195e0",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "The 'toml' package isn't installed. To load settings from pyproject.toml or ~/.jupysql/config, install with: pip install toml"
+ ],
+ "text/plain": [
+ "The 'toml' package isn't installed. To load settings from pyproject.toml or ~/.jupysql/config, install with: pip install toml"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "Connecting to 'duckdb:///../../database/data.duckdb'"
+ ],
+ "text/plain": [
+ "Connecting to 'duckdb:///../../database/data.duckdb'"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "%load_ext sql\n",
+ "%sql duckdb:///../../database/data.duckdb"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "3e1967e8-eba0-4261-bf9c-d16dd4a9b271",
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "Running query in 'duckdb:///../../database/data.duckdb'"
+ ],
+ "text/plain": [
+ "Running query in 'duckdb:///../../database/data.duckdb'"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " cdparametresiseeaux | \n",
+ " categorie_1 | \n",
+ " categorie_2 | \n",
+ " categorie_3 | \n",
+ " limite_qualite | \n",
+ " limite_qualite_unite | \n",
+ " valeur_sanitaire_1 | \n",
+ " valeur_sanitaire_1_unite | \n",
+ " valeur_sanitaire_2 | \n",
+ " valeur_sanitaire_2_unite | \n",
+ " nb_rows | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " NO3 | \n",
+ " nitrate | \n",
+ " None | \n",
+ " None | \n",
+ " 50.0 | \n",
+ " mg/L | \n",
+ " None | \n",
+ " None | \n",
+ " None | \n",
+ " None | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " NO2 | \n",
+ " nitrate | \n",
+ " None | \n",
+ " None | \n",
+ " 0.5 | \n",
+ " mg/L | \n",
+ " None | \n",
+ " None | \n",
+ " None | \n",
+ " None | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " NO3_NO2 | \n",
+ " nitrate | \n",
+ " None | \n",
+ " None | \n",
+ " 1.0 | \n",
+ " None | \n",
+ " None | \n",
+ " None | \n",
+ " None | \n",
+ " None | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ "+---------------------+-------------+-------------+-------------+----------------+----------------------+--------------------+--------------------------+--------------------+--------------------------+---------+\n",
+ "| cdparametresiseeaux | categorie_1 | categorie_2 | categorie_3 | limite_qualite | limite_qualite_unite | valeur_sanitaire_1 | valeur_sanitaire_1_unite | valeur_sanitaire_2 | valeur_sanitaire_2_unite | nb_rows |\n",
+ "+---------------------+-------------+-------------+-------------+----------------+----------------------+--------------------+--------------------------+--------------------+--------------------------+---------+\n",
+ "| NO3 | nitrate | None | None | 50.0 | mg/L | None | None | None | None | 1 |\n",
+ "| NO2 | nitrate | None | None | 0.5 | mg/L | None | None | None | None | 1 |\n",
+ "| NO3_NO2 | nitrate | None | None | 1.0 | None | None | None | None | None | 1 |\n",
+ "+---------------------+-------------+-------------+-------------+----------------+----------------------+--------------------+--------------------------+--------------------+--------------------------+---------+"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "%%sql\n",
+ "SELECT * FROM int__valeurs_de_reference WHERE categorie_1='nitrate'"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "1aff16f9-21a7-4e2b-a3f6-17fc453d7dbc",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "Running query in 'duckdb:///../../database/data.duckdb'"
+ ],
+ "text/plain": [
+ "Running query in 'duckdb:///../../database/data.duckdb'"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " limite_qualite_no3 | \n",
+ " limite_qualite_no3_no2 | \n",
+ " limite_qualite_no2 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 50.0 | \n",
+ " 1.0 | \n",
+ " 0.5 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ "+--------------------+------------------------+--------------------+\n",
+ "| limite_qualite_no3 | limite_qualite_no3_no2 | limite_qualite_no2 |\n",
+ "+--------------------+------------------------+--------------------+\n",
+ "| 50.0 | 1.0 | 0.5 |\n",
+ "+--------------------+------------------------+--------------------+"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "%%sql\n",
+ "SELECT\n",
+ " MAX(\n",
+ " CASE\n",
+ " WHEN\n",
+ " cdparametresiseeaux = 'NO3'\n",
+ " THEN limite_qualite\n",
+ " END\n",
+ " ) AS limite_qualite_no3,\n",
+ " MAX(\n",
+ " CASE\n",
+ " WHEN\n",
+ " cdparametresiseeaux = 'NO3_NO2'\n",
+ " THEN limite_qualite\n",
+ " END\n",
+ " ) AS limite_qualite_no3_no2,\n",
+ " MAX(\n",
+ " CASE\n",
+ " WHEN\n",
+ " cdparametresiseeaux = 'NO2'\n",
+ " THEN limite_qualite\n",
+ " END\n",
+ " ) AS limite_qualite_no2\n",
+ "FROM\n",
+ " int__valeurs_de_reference\n",
+ "WHERE\n",
+ " categorie_1 = 'nitrate'"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "34654cff-fb90-4224-a5db-8086186a23f1",
+ "metadata": {},
+ "source": [
+ "**Les règles choisies**\n",
+ "\n",
+ "Pour le choix du dernier prélèvement (date et id) : on se réfère uniquement à nitrate (no3) \n",
+ "Mais on doit regarder ensuite toutes les données (no3/no2) des prélèvements sélectionnés\n",
+ "\n",
+ "- Si on n'a pas nitrate (no3) : pas de données dans la table. ca sera \"pas recherché\" sur le site\n",
+ "- Si nitrates (no3) ET nitrites (no2) \n",
+ " - Si Nitrates < 50 mg/L et nitrites < 0,5 mg/L et nitrate/50 + nitrites/3 < 1 mg/L --> inf_limite_qualite\n",
+ " - Si Nitrates >= 50 mg/L et/ou nitrites >= 0,5 mg/L et/ou nitrate/50 + nitrites/3 >= 1 mg/L --> sup_limite_qualite\n",
+ "- Si nitrates (no3) et pas nitrites (no2) : \n",
+ " - Nitrates < 50 mg/L --> inf_limite_qualite \n",
+ " - Si Nitrates >= 50 mg/L -> sup_limite_qualite"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "de799aa8-64a7-4423-901c-7de0fc237b70",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "Running query in 'duckdb:///../../database/data.duckdb'"
+ ],
+ "text/plain": [
+ "Running query in 'duckdb:///../../database/data.duckdb'"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "3066bdabe1a64b02991ce29b03368a80",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "FloatProgress(value=0.0, layout=Layout(width='auto'), style=ProgressStyle(bar_color='black'))"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " cdreseau | \n",
+ " categorie | \n",
+ " periode | \n",
+ " dernier_prel_datetime | \n",
+ " nb_parametres | \n",
+ " resultat | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 043000382 | \n",
+ " nitrate | \n",
+ " dernier_prel | \n",
+ " 2024-08-21 11:04:00 | \n",
+ " 3 | \n",
+ " inf_limite_qualite | \n",
+ "
\n",
+ " \n",
+ " 048000421 | \n",
+ " nitrate | \n",
+ " dernier_prel | \n",
+ " 2024-05-23 12:04:00 | \n",
+ " 2 | \n",
+ " inf_limite_qualite | \n",
+ "
\n",
+ " \n",
+ " 055000098 | \n",
+ " nitrate | \n",
+ " dernier_prel | \n",
+ " 2024-08-05 08:48:00 | \n",
+ " 3 | \n",
+ " inf_limite_qualite | \n",
+ "
\n",
+ " \n",
+ " 066000236 | \n",
+ " nitrate | \n",
+ " dernier_prel | \n",
+ " 2024-06-19 10:33:00 | \n",
+ " 2 | \n",
+ " inf_limite_qualite | \n",
+ "
\n",
+ " \n",
+ " 066000312 | \n",
+ " nitrate | \n",
+ " dernier_prel | \n",
+ " 2024-10-29 10:32:00 | \n",
+ " 2 | \n",
+ " inf_limite_qualite | \n",
+ "
\n",
+ " \n",
+ " 067001856 | \n",
+ " nitrate | \n",
+ " dernier_prel | \n",
+ " 2024-12-06 08:15:00 | \n",
+ " 3 | \n",
+ " inf_limite_qualite | \n",
+ "
\n",
+ " \n",
+ " 068001002 | \n",
+ " nitrate | \n",
+ " dernier_prel | \n",
+ " 2024-10-28 09:40:00 | \n",
+ " 2 | \n",
+ " inf_limite_qualite | \n",
+ "
\n",
+ " \n",
+ " 073001318 | \n",
+ " nitrate | \n",
+ " dernier_prel | \n",
+ " 2024-12-19 09:35:00 | \n",
+ " 3 | \n",
+ " inf_limite_qualite | \n",
+ "
\n",
+ " \n",
+ " 073001176 | \n",
+ " nitrate | \n",
+ " dernier_prel | \n",
+ " 2024-08-28 11:59:00 | \n",
+ " 3 | \n",
+ " inf_limite_qualite | \n",
+ "
\n",
+ " \n",
+ " 080000913 | \n",
+ " nitrate | \n",
+ " dernier_prel | \n",
+ " 2024-11-28 14:38:00 | \n",
+ " 3 | \n",
+ " inf_limite_qualite | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "Truncated to displaylimit of 10."
+ ],
+ "text/plain": [
+ "+-----------+-----------+--------------+-----------------------+---------------+--------------------+\n",
+ "| cdreseau | categorie | periode | dernier_prel_datetime | nb_parametres | resultat |\n",
+ "+-----------+-----------+--------------+-----------------------+---------------+--------------------+\n",
+ "| 043000382 | nitrate | dernier_prel | 2024-08-21 11:04:00 | 3 | inf_limite_qualite |\n",
+ "| 048000421 | nitrate | dernier_prel | 2024-05-23 12:04:00 | 2 | inf_limite_qualite |\n",
+ "| 055000098 | nitrate | dernier_prel | 2024-08-05 08:48:00 | 3 | inf_limite_qualite |\n",
+ "| 066000236 | nitrate | dernier_prel | 2024-06-19 10:33:00 | 2 | inf_limite_qualite |\n",
+ "| 066000312 | nitrate | dernier_prel | 2024-10-29 10:32:00 | 2 | inf_limite_qualite |\n",
+ "| 067001856 | nitrate | dernier_prel | 2024-12-06 08:15:00 | 3 | inf_limite_qualite |\n",
+ "| 068001002 | nitrate | dernier_prel | 2024-10-28 09:40:00 | 2 | inf_limite_qualite |\n",
+ "| 073001318 | nitrate | dernier_prel | 2024-12-19 09:35:00 | 3 | inf_limite_qualite |\n",
+ "| 073001176 | nitrate | dernier_prel | 2024-08-28 11:59:00 | 3 | inf_limite_qualite |\n",
+ "| 080000913 | nitrate | dernier_prel | 2024-11-28 14:38:00 | 3 | inf_limite_qualite |\n",
+ "+-----------+-----------+--------------+-----------------------+---------------+--------------------+\n",
+ "Truncated to displaylimit of 10."
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "%%sql --save int__resultats_nitrites_udi_dernier\n",
+ "WITH\n",
+ "last_pvl AS (\n",
+ " SELECT\n",
+ " cdreseau,\n",
+ " referenceprel,\n",
+ " datetimeprel,\n",
+ " ROW_NUMBER()\n",
+ " OVER (\n",
+ " PARTITION BY cdreseau, cdparametresiseeaux\n",
+ " ORDER BY datetimeprel DESC\n",
+ " )\n",
+ " AS row_number\n",
+ " FROM\n",
+ " int__resultats_udi_communes\n",
+ " WHERE\n",
+ " categorie = 'nitrate'\n",
+ " AND cdparametresiseeaux = 'NO3'\n",
+ " AND -- On garde les prélèvements de moins d'un an\n",
+ " CURRENT_DATE - datetimeprel < INTERVAL 1 YEAR\n",
+ " AND valtraduite IS NOT NULL \n",
+ "),\n",
+ "\n",
+ "valeur_ref AS (\n",
+ " SELECT\n",
+ " MAX(\n",
+ " CASE\n",
+ " WHEN\n",
+ " cdparametresiseeaux = 'NO3'\n",
+ " THEN limite_qualite\n",
+ " END\n",
+ " ) AS limite_qualite_no3,\n",
+ " MAX(\n",
+ " CASE\n",
+ " WHEN\n",
+ " cdparametresiseeaux = 'NO3_NO2'\n",
+ " THEN limite_qualite\n",
+ " END\n",
+ " ) AS limite_qualite_no3_no2,\n",
+ " MAX(\n",
+ " CASE\n",
+ " WHEN\n",
+ " cdparametresiseeaux = 'NO2'\n",
+ " THEN limite_qualite\n",
+ " END\n",
+ " ) AS limite_qualite_no2\n",
+ " FROM\n",
+ " int__valeurs_de_reference\n",
+ " WHERE\n",
+ " categorie_1 = 'nitrate'\n",
+ "),\n",
+ "\n",
+ "split_nitrites AS (\n",
+ " SELECT\n",
+ " resultats.cdreseau,\n",
+ " resultats.categorie,\n",
+ " resultats.datetimeprel AS dernier_prel_datetime,\n",
+ " COUNT(DISTINCT resultats.cdparametresiseeaux) AS nb_parametres,\n",
+ " MAX(\n",
+ " CASE\n",
+ " WHEN\n",
+ " resultats.cdparametresiseeaux = 'NO3'\n",
+ " THEN resultats.valtraduite\n",
+ " END\n",
+ " ) AS valtraduite_no3,\n",
+ " MAX(\n",
+ " CASE\n",
+ " WHEN\n",
+ " resultats.cdparametresiseeaux = 'NO2'\n",
+ " THEN resultats.valtraduite\n",
+ " END\n",
+ " ) AS valtraduite_no2,\n",
+ " MAX(\n",
+ " CASE\n",
+ " WHEN\n",
+ " resultats.cdparametresiseeaux = 'NO3_NO2'\n",
+ " THEN resultats.valtraduite\n",
+ " END\n",
+ " ) AS valtraduite_no3_no2\n",
+ " FROM\n",
+ " last_pvl\n",
+ " LEFT JOIN\n",
+ " int__resultats_udi_communes AS resultats\n",
+ " ON\n",
+ " resultats.cdreseau = last_pvl.cdreseau\n",
+ " AND resultats.referenceprel = last_pvl.referenceprel\n",
+ " WHERE\n",
+ " last_pvl.row_number = 1 \n",
+ " -- on ne veut que le dernier prélèvement\n",
+ " AND resultats.categorie = 'nitrate' \n",
+ " -- on ne veut que les résultats associé aux nitrates/nitrites\n",
+ " GROUP BY\n",
+ " resultats.cdreseau,\n",
+ " resultats.categorie,\n",
+ " resultats.datetimeprel\n",
+ "),\n",
+ "\n",
+ "split_nitrites_with_ref AS (\n",
+ " SELECT\n",
+ " split_nitrites.cdreseau,\n",
+ " split_nitrites.categorie,\n",
+ " split_nitrites.nb_parametres,\n",
+ " split_nitrites.dernier_prel_datetime,\n",
+ " valeur_ref.limite_qualite_no3,\n",
+ " valeur_ref.limite_qualite_no2,\n",
+ " valeur_ref.limite_qualite_no3_no2,\n",
+ " split_nitrites.valtraduite_no3_no2,\n",
+ " split_nitrites.valtraduite_no3,\n",
+ " split_nitrites.valtraduite_no2\n",
+ " FROM\n",
+ " split_nitrites\n",
+ " CROSS JOIN\n",
+ " valeur_ref\n",
+ ")\n",
+ "\n",
+ "SELECT\n",
+ " split_nitrites_with_ref.cdreseau,\n",
+ " split_nitrites_with_ref.categorie,\n",
+ " 'dernier_prel' AS periode,\n",
+ " split_nitrites_with_ref.dernier_prel_datetime,\n",
+ " split_nitrites_with_ref.nb_parametres,\n",
+ " CASE\n",
+ " WHEN -- Si nitrates (no3) et pas nitrites (no2)\n",
+ " split_nitrites_with_ref.valtraduite_no3 IS NOT NULL \n",
+ " AND split_nitrites_with_ref.valtraduite_no2 IS NULL\n",
+ " AND\n",
+ " split_nitrites_with_ref.valtraduite_no3\n",
+ " < split_nitrites_with_ref.limite_qualite_no3\n",
+ " THEN 'inf_limite_qualite'\n",
+ " WHEN\n",
+ " split_nitrites_with_ref.valtraduite_no3 IS NOT NULL \n",
+ " AND split_nitrites_with_ref.valtraduite_no2 IS NULL\n",
+ " AND\n",
+ " split_nitrites_with_ref.valtraduite_no3\n",
+ " >= split_nitrites_with_ref.limite_qualite_no3\n",
+ " THEN 'sup_limite_qualite'\n",
+ " WHEN -- Si nitrates (no3) ET nitrites (no2)\n",
+ " split_nitrites_with_ref.valtraduite_no3 IS NOT NULL\n",
+ " AND split_nitrites_with_ref.valtraduite_no2 IS NOT NULL\n",
+ " AND (\n",
+ " split_nitrites_with_ref.valtraduite_no3\n",
+ " >= split_nitrites_with_ref.limite_qualite_no3\n",
+ " OR split_nitrites_with_ref.valtraduite_no2\n",
+ " >= split_nitrites_with_ref.limite_qualite_no2\n",
+ " OR COALESCE(\n",
+ " split_nitrites_with_ref.valtraduite_no3_no2,\n",
+ " (\n",
+ " split_nitrites_with_ref.valtraduite_no3 / 50\n",
+ " + split_nitrites_with_ref.valtraduite_no2 / 3\n",
+ " )\n",
+ " )\n",
+ " >= split_nitrites_with_ref.limite_qualite_no3_no2\n",
+ " )\n",
+ " THEN 'sup_limite_qualite'\n",
+ " WHEN\n",
+ " split_nitrites_with_ref.valtraduite_no3 IS NOT NULL\n",
+ " AND split_nitrites_with_ref.valtraduite_no2 IS NOT NULL\n",
+ " AND split_nitrites_with_ref.valtraduite_no3\n",
+ " < split_nitrites_with_ref.limite_qualite_no3\n",
+ " AND split_nitrites_with_ref.valtraduite_no2\n",
+ " < split_nitrites_with_ref.limite_qualite_no2\n",
+ " AND COALESCE(\n",
+ " split_nitrites_with_ref.valtraduite_no3_no2,\n",
+ " (\n",
+ " split_nitrites_with_ref.valtraduite_no3 / 50\n",
+ " + split_nitrites_with_ref.valtraduite_no2 / 3\n",
+ " )\n",
+ " )\n",
+ " < split_nitrites_with_ref.limite_qualite_no3_no2\n",
+ " THEN 'inf_limite_qualite'\n",
+ " ELSE 'erreur'\n",
+ " END AS resultat\n",
+ "FROM\n",
+ " split_nitrites_with_ref\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "fe5821d3-419f-46af-92d4-311f50d4a9b7",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "Running query in 'duckdb:///../../database/data.duckdb'"
+ ],
+ "text/plain": [
+ "Running query in 'duckdb:///../../database/data.duckdb'"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "9765c37b8ba34e33842642772307caed",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "FloatProgress(value=0.0, layout=Layout(width='auto'), style=ProgressStyle(bar_color='black'))"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " resultat | \n",
+ " count_star() | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " inf_limite_qualite | \n",
+ " 21184 | \n",
+ "
\n",
+ " \n",
+ " sup_limite_qualite | \n",
+ " 224 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ "+--------------------+--------------+\n",
+ "| resultat | count_star() |\n",
+ "+--------------------+--------------+\n",
+ "| inf_limite_qualite | 21184 |\n",
+ "| sup_limite_qualite | 224 |\n",
+ "+--------------------+--------------+"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "%%sql --with int__resultats_nitrites_udi_dernier\n",
+ "SELECT \n",
+ " resultat, COUNT(*)\n",
+ "FROM \n",
+ " int__resultats_nitrites_udi_dernier\n",
+ "GROUP BY 1"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "2a287b57-fa15-4939-8209-7dcdf0e75eda",
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "Running query in 'duckdb:///../../database/data.duckdb'"
+ ],
+ "text/plain": [
+ "Running query in 'duckdb:///../../database/data.duckdb'"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "f48e5a03122345c3828600482cba31db",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "FloatProgress(value=0.0, layout=Layout(width='auto'), style=ProgressStyle(bar_color='black'))"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " cdreseau | \n",
+ " categorie | \n",
+ " periode | \n",
+ " dernier_prel_datetime | \n",
+ " nb_parametres | \n",
+ " resultat | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ "+----------+-----------+---------+-----------------------+---------------+----------+\n",
+ "| cdreseau | categorie | periode | dernier_prel_datetime | nb_parametres | resultat |\n",
+ "+----------+-----------+---------+-----------------------+---------------+----------+\n",
+ "+----------+-----------+---------+-----------------------+---------------+----------+"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "%%sql --with int__resultats_nitrites_udi_dernier\n",
+ "SELECT \n",
+ " * \n",
+ "FROM \n",
+ " int__resultats_nitrites_udi_dernier\n",
+ "WHERE \n",
+ " resultat='erreur'"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5cefcf3f-208f-4427-9e77-9155a20b7c65",
+ "metadata": {},
+ "source": [
+ "#### Cf cas cdreseau IN( '034005906') , referenceprel= 03400327764"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "ee06ff28-628c-481c-b9d9-eb8e23bba6b5",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "Running query in 'duckdb:///../../database/data.duckdb'"
+ ],
+ "text/plain": [
+ "Running query in 'duckdb:///../../database/data.duckdb'"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "c4298322f3e6460c8dc50d5e0e5f420f",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "FloatProgress(value=0.0, layout=Layout(width='auto'), style=ProgressStyle(bar_color='black'))"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " referenceprel | \n",
+ " cdparametresiseeaux | \n",
+ " de_partition | \n",
+ " valtraduite | \n",
+ " categorie | \n",
+ " categorie_2 | \n",
+ " categorie_3 | \n",
+ " limite_qualite | \n",
+ " valeur_sanitaire_1 | \n",
+ " valeur_sanitaire_2 | \n",
+ " cdreseau | \n",
+ " inseecommune | \n",
+ " datetimeprel | \n",
+ " row_number | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 03400327273 | \n",
+ " NO3 | \n",
+ " 2025 | \n",
+ " None | \n",
+ " nitrate | \n",
+ " None | \n",
+ " None | \n",
+ " 50.0 | \n",
+ " None | \n",
+ " None | \n",
+ " 034005906 | \n",
+ " 34088 | \n",
+ " 2025-01-31 09:34:00 | \n",
+ " 9 | \n",
+ "
\n",
+ " \n",
+ " 03400327273 | \n",
+ " NO3 | \n",
+ " 2025 | \n",
+ " None | \n",
+ " nitrate | \n",
+ " None | \n",
+ " None | \n",
+ " 50.0 | \n",
+ " None | \n",
+ " None | \n",
+ " 034005906 | \n",
+ " 34087 | \n",
+ " 2025-01-31 09:34:00 | \n",
+ " 10 | \n",
+ "
\n",
+ " \n",
+ " 03400327275 | \n",
+ " NO3 | \n",
+ " 2025 | \n",
+ " None | \n",
+ " nitrate | \n",
+ " None | \n",
+ " None | \n",
+ " 50.0 | \n",
+ " None | \n",
+ " None | \n",
+ " 034005906 | \n",
+ " 34088 | \n",
+ " 2025-01-28 07:50:00 | \n",
+ " 11 | \n",
+ "
\n",
+ " \n",
+ " 03400327275 | \n",
+ " NO3 | \n",
+ " 2025 | \n",
+ " None | \n",
+ " nitrate | \n",
+ " None | \n",
+ " None | \n",
+ " 50.0 | \n",
+ " None | \n",
+ " None | \n",
+ " 034005906 | \n",
+ " 34087 | \n",
+ " 2025-01-28 07:50:00 | \n",
+ " 12 | \n",
+ "
\n",
+ " \n",
+ " 03400327272 | \n",
+ " NO3 | \n",
+ " 2025 | \n",
+ " None | \n",
+ " nitrate | \n",
+ " None | \n",
+ " None | \n",
+ " 50.0 | \n",
+ " None | \n",
+ " None | \n",
+ " 034005906 | \n",
+ " 34088 | \n",
+ " 2025-01-08 10:17:00 | \n",
+ " 13 | \n",
+ "
\n",
+ " \n",
+ " 03400327272 | \n",
+ " NO3 | \n",
+ " 2025 | \n",
+ " None | \n",
+ " nitrate | \n",
+ " None | \n",
+ " None | \n",
+ " 50.0 | \n",
+ " None | \n",
+ " None | \n",
+ " 034005906 | \n",
+ " 34087 | \n",
+ " 2025-01-08 10:17:00 | \n",
+ " 14 | \n",
+ "
\n",
+ " \n",
+ " 03400316443 | \n",
+ " NO3 | \n",
+ " 2024 | \n",
+ " 3.000 | \n",
+ " nitrate | \n",
+ " None | \n",
+ " None | \n",
+ " 50.0 | \n",
+ " None | \n",
+ " None | \n",
+ " 034005906 | \n",
+ " 34087 | \n",
+ " 2024-12-03 09:23:00 | \n",
+ " 15 | \n",
+ "
\n",
+ " \n",
+ " 03400316443 | \n",
+ " NO3 | \n",
+ " 2024 | \n",
+ " 3.000 | \n",
+ " nitrate | \n",
+ " None | \n",
+ " None | \n",
+ " 50.0 | \n",
+ " None | \n",
+ " None | \n",
+ " 034005906 | \n",
+ " 34088 | \n",
+ " 2024-12-03 09:23:00 | \n",
+ " 16 | \n",
+ "
\n",
+ " \n",
+ " 03400327764 | \n",
+ " NO3 | \n",
+ " 2025 | \n",
+ " None | \n",
+ " nitrate | \n",
+ " None | \n",
+ " None | \n",
+ " 50.0 | \n",
+ " None | \n",
+ " None | \n",
+ " 034005906 | \n",
+ " 34088 | \n",
+ " 2025-02-21 10:16:00 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " 03400327764 | \n",
+ " NO3 | \n",
+ " 2025 | \n",
+ " None | \n",
+ " nitrate | \n",
+ " None | \n",
+ " None | \n",
+ " 50.0 | \n",
+ " None | \n",
+ " None | \n",
+ " 034005906 | \n",
+ " 34087 | \n",
+ " 2025-02-21 10:16:00 | \n",
+ " 2 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "Truncated to displaylimit of 10."
+ ],
+ "text/plain": [
+ "+---------------+---------------------+--------------+-------------+-----------+-------------+-------------+----------------+--------------------+--------------------+-----------+--------------+---------------------+------------+\n",
+ "| referenceprel | cdparametresiseeaux | de_partition | valtraduite | categorie | categorie_2 | categorie_3 | limite_qualite | valeur_sanitaire_1 | valeur_sanitaire_2 | cdreseau | inseecommune | datetimeprel | row_number |\n",
+ "+---------------+---------------------+--------------+-------------+-----------+-------------+-------------+----------------+--------------------+--------------------+-----------+--------------+---------------------+------------+\n",
+ "| 03400327273 | NO3 | 2025 | None | nitrate | None | None | 50.0 | None | None | 034005906 | 34088 | 2025-01-31 09:34:00 | 9 |\n",
+ "| 03400327273 | NO3 | 2025 | None | nitrate | None | None | 50.0 | None | None | 034005906 | 34087 | 2025-01-31 09:34:00 | 10 |\n",
+ "| 03400327275 | NO3 | 2025 | None | nitrate | None | None | 50.0 | None | None | 034005906 | 34088 | 2025-01-28 07:50:00 | 11 |\n",
+ "| 03400327275 | NO3 | 2025 | None | nitrate | None | None | 50.0 | None | None | 034005906 | 34087 | 2025-01-28 07:50:00 | 12 |\n",
+ "| 03400327272 | NO3 | 2025 | None | nitrate | None | None | 50.0 | None | None | 034005906 | 34088 | 2025-01-08 10:17:00 | 13 |\n",
+ "| 03400327272 | NO3 | 2025 | None | nitrate | None | None | 50.0 | None | None | 034005906 | 34087 | 2025-01-08 10:17:00 | 14 |\n",
+ "| 03400316443 | NO3 | 2024 | 3.000 | nitrate | None | None | 50.0 | None | None | 034005906 | 34087 | 2024-12-03 09:23:00 | 15 |\n",
+ "| 03400316443 | NO3 | 2024 | 3.000 | nitrate | None | None | 50.0 | None | None | 034005906 | 34088 | 2024-12-03 09:23:00 | 16 |\n",
+ "| 03400327764 | NO3 | 2025 | None | nitrate | None | None | 50.0 | None | None | 034005906 | 34088 | 2025-02-21 10:16:00 | 1 |\n",
+ "| 03400327764 | NO3 | 2025 | None | nitrate | None | None | 50.0 | None | None | 034005906 | 34087 | 2025-02-21 10:16:00 | 2 |\n",
+ "+---------------+---------------------+--------------+-------------+-----------+-------------+-------------+----------------+--------------------+--------------------+-----------+--------------+---------------------+------------+\n",
+ "Truncated to displaylimit of 10."
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "%%sql\n",
+ " SELECT\n",
+ "*,\n",
+ " ROW_NUMBER()\n",
+ " OVER (\n",
+ " PARTITION BY cdreseau, cdparametresiseeaux\n",
+ " ORDER BY datetimeprel DESC\n",
+ " )\n",
+ " AS row_number\n",
+ " FROM\n",
+ " int__resultats_udi_communes\n",
+ " WHERE\n",
+ " categorie = 'nitrate'\n",
+ " AND cdparametresiseeaux = 'NO3'\n",
+ " AND -- On garde les prélèvements de moins d'un an\n",
+ " CURRENT_DATE - datetimeprel < INTERVAL 1 YEAR\n",
+ " AND cdreseau IN( '034005906')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "30487685-f619-43ab-be20-054cb46db3c6",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "Running query in 'duckdb:///../../database/data.duckdb'"
+ ],
+ "text/plain": [
+ "Running query in 'duckdb:///../../database/data.duckdb'"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "44938b0061f2429fac4a8d6cbc417b43",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "FloatProgress(value=0.0, layout=Layout(width='auto'), style=ProgressStyle(bar_color='black'))"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " resultat | \n",
+ " min_cdreseau | \n",
+ " max_cdreseau | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " sup_limite_qualite | \n",
+ " 002000060 | \n",
+ " 089003505 | \n",
+ "
\n",
+ " \n",
+ " inf_limite_qualite | \n",
+ " 001000003 | \n",
+ " 976003881 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ "+--------------------+--------------+--------------+\n",
+ "| resultat | min_cdreseau | max_cdreseau |\n",
+ "+--------------------+--------------+--------------+\n",
+ "| sup_limite_qualite | 002000060 | 089003505 |\n",
+ "| inf_limite_qualite | 001000003 | 976003881 |\n",
+ "+--------------------+--------------+--------------+"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "%%sql --with int__resultats_nitrites_udi_dernier\n",
+ "SELECT \n",
+ " resultat, MIN( cdreseau) min_cdreseau, MAX(cdreseau) AS max_cdreseau\n",
+ "FROM \n",
+ " int__resultats_nitrites_udi_dernier\n",
+ "GROUP BY 1"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c596b48d-ebc4-4fb9-aab8-b626076792d2",
+ "metadata": {},
+ "source": [
+ "# Check "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "761be547-f21e-4712-a898-4175f8faa89c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "Running query in 'duckdb:///../../database/data.duckdb'"
+ ],
+ "text/plain": [
+ "Running query in 'duckdb:///../../database/data.duckdb'"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "bb7505505f924276a448034699a521e1",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "FloatProgress(value=0.0, layout=Layout(width='auto'), style=ProgressStyle(bar_color='black'))"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " cdreseau | \n",
+ " categorie | \n",
+ " nb_parametres | \n",
+ " dernier_prel_datetime | \n",
+ " limite_qualite_no3 | \n",
+ " limite_qualite_no2 | \n",
+ " limite_qualite_no3_no2 | \n",
+ " valtraduite_no3_no2 | \n",
+ " valtraduite_no3 | \n",
+ " valtraduite_no2 | \n",
+ " resultat | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 001000003 | \n",
+ " nitrate | \n",
+ " 3 | \n",
+ " 2025-01-21 12:35:00 | \n",
+ " 50.0 | \n",
+ " 0.5 | \n",
+ " 1.0 | \n",
+ " 0.280 | \n",
+ " 14.000 | \n",
+ " 0.000 | \n",
+ " inf_limite_qualite | \n",
+ "
\n",
+ " \n",
+ " 001000260 | \n",
+ " nitrate | \n",
+ " 3 | \n",
+ " 2024-12-06 12:02:00 | \n",
+ " 50.0 | \n",
+ " 0.5 | \n",
+ " 1.0 | \n",
+ " 0.050 | \n",
+ " 2.400 | \n",
+ " 0.000 | \n",
+ " inf_limite_qualite | \n",
+ "
\n",
+ " \n",
+ " 001000268 | \n",
+ " nitrate | \n",
+ " 3 | \n",
+ " 2025-01-13 09:57:00 | \n",
+ " 50.0 | \n",
+ " 0.5 | \n",
+ " 1.0 | \n",
+ " 0.120 | \n",
+ " 6.000 | \n",
+ " 0.000 | \n",
+ " inf_limite_qualite | \n",
+ "
\n",
+ " \n",
+ " 001000293 | \n",
+ " nitrate | \n",
+ " 3 | \n",
+ " 2025-01-28 11:29:00 | \n",
+ " 50.0 | \n",
+ " 0.5 | \n",
+ " 1.0 | \n",
+ " 0.070 | \n",
+ " 3.700 | \n",
+ " 0.000 | \n",
+ " inf_limite_qualite | \n",
+ "
\n",
+ " \n",
+ " 002000060 | \n",
+ " nitrate | \n",
+ " 2 | \n",
+ " 2024-10-18 08:50:00 | \n",
+ " 50.0 | \n",
+ " 0.5 | \n",
+ " 1.0 | \n",
+ " None | \n",
+ " 59.300 | \n",
+ " 0.000 | \n",
+ " sup_limite_qualite | \n",
+ "
\n",
+ " \n",
+ " 095000346 | \n",
+ " nitrate | \n",
+ " 1 | \n",
+ " 2025-02-27 08:35:00 | \n",
+ " 50.0 | \n",
+ " 0.5 | \n",
+ " 1.0 | \n",
+ " None | \n",
+ " 47.000 | \n",
+ " None | \n",
+ " inf_limite_qualite | \n",
+ "
\n",
+ " \n",
+ " 973000028 | \n",
+ " nitrate | \n",
+ " 2 | \n",
+ " 2024-12-02 11:30:00 | \n",
+ " 50.0 | \n",
+ " 0.5 | \n",
+ " 1.0 | \n",
+ " None | \n",
+ " 0.000 | \n",
+ " 0.000 | \n",
+ " inf_limite_qualite | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ "+-----------+-----------+---------------+-----------------------+--------------------+--------------------+------------------------+---------------------+-----------------+-----------------+--------------------+\n",
+ "| cdreseau | categorie | nb_parametres | dernier_prel_datetime | limite_qualite_no3 | limite_qualite_no2 | limite_qualite_no3_no2 | valtraduite_no3_no2 | valtraduite_no3 | valtraduite_no2 | resultat |\n",
+ "+-----------+-----------+---------------+-----------------------+--------------------+--------------------+------------------------+---------------------+-----------------+-----------------+--------------------+\n",
+ "| 001000003 | nitrate | 3 | 2025-01-21 12:35:00 | 50.0 | 0.5 | 1.0 | 0.280 | 14.000 | 0.000 | inf_limite_qualite |\n",
+ "| 001000260 | nitrate | 3 | 2024-12-06 12:02:00 | 50.0 | 0.5 | 1.0 | 0.050 | 2.400 | 0.000 | inf_limite_qualite |\n",
+ "| 001000268 | nitrate | 3 | 2025-01-13 09:57:00 | 50.0 | 0.5 | 1.0 | 0.120 | 6.000 | 0.000 | inf_limite_qualite |\n",
+ "| 001000293 | nitrate | 3 | 2025-01-28 11:29:00 | 50.0 | 0.5 | 1.0 | 0.070 | 3.700 | 0.000 | inf_limite_qualite |\n",
+ "| 002000060 | nitrate | 2 | 2024-10-18 08:50:00 | 50.0 | 0.5 | 1.0 | None | 59.300 | 0.000 | sup_limite_qualite |\n",
+ "| 095000346 | nitrate | 1 | 2025-02-27 08:35:00 | 50.0 | 0.5 | 1.0 | None | 47.000 | None | inf_limite_qualite |\n",
+ "| 973000028 | nitrate | 2 | 2024-12-02 11:30:00 | 50.0 | 0.5 | 1.0 | None | 0.000 | 0.000 | inf_limite_qualite |\n",
+ "+-----------+-----------+---------------+-----------------------+--------------------+--------------------+------------------------+---------------------+-----------------+-----------------+--------------------+"
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "%%sql\n",
+ "WITH\n",
+ "last_pvl AS (\n",
+ " SELECT\n",
+ " cdreseau,\n",
+ " referenceprel,\n",
+ " datetimeprel,\n",
+ " ROW_NUMBER()\n",
+ " OVER (\n",
+ " PARTITION BY cdreseau, cdparametresiseeaux\n",
+ " ORDER BY datetimeprel DESC\n",
+ " )\n",
+ " AS row_number\n",
+ " FROM\n",
+ " int__resultats_udi_communes\n",
+ " WHERE\n",
+ " categorie = 'nitrate'\n",
+ " AND cdparametresiseeaux = 'NO3'\n",
+ " AND -- On garde les prélèvements de moins d'un an\n",
+ " CURRENT_DATE - datetimeprel < INTERVAL 1 YEAR\n",
+ " AND valtraduite IS NOT NULL \n",
+ "),\n",
+ "\n",
+ "valeur_ref AS (\n",
+ " SELECT\n",
+ " MAX(\n",
+ " CASE\n",
+ " WHEN\n",
+ " cdparametresiseeaux = 'NO3'\n",
+ " THEN limite_qualite\n",
+ " END\n",
+ " ) AS limite_qualite_no3,\n",
+ " MAX(\n",
+ " CASE\n",
+ " WHEN\n",
+ " cdparametresiseeaux = 'NO3_NO2'\n",
+ " THEN limite_qualite\n",
+ " END\n",
+ " ) AS limite_qualite_no3_no2,\n",
+ " MAX(\n",
+ " CASE\n",
+ " WHEN\n",
+ " cdparametresiseeaux = 'NO2'\n",
+ " THEN limite_qualite\n",
+ " END\n",
+ " ) AS limite_qualite_no2\n",
+ " FROM\n",
+ " int__valeurs_de_reference\n",
+ " WHERE\n",
+ " categorie_1 = 'nitrate'\n",
+ "),\n",
+ "\n",
+ "split_nitrites AS (\n",
+ " SELECT\n",
+ " resultats.cdreseau,\n",
+ " resultats.categorie,\n",
+ " resultats.datetimeprel AS dernier_prel_datetime,\n",
+ " COUNT(DISTINCT resultats.cdparametresiseeaux) AS nb_parametres,\n",
+ " MAX(\n",
+ " CASE\n",
+ " WHEN\n",
+ " resultats.cdparametresiseeaux = 'NO3'\n",
+ " THEN resultats.valtraduite\n",
+ " END\n",
+ " ) AS valtraduite_no3,\n",
+ " MAX(\n",
+ " CASE\n",
+ " WHEN\n",
+ " resultats.cdparametresiseeaux = 'NO2'\n",
+ " THEN resultats.valtraduite\n",
+ " END\n",
+ " ) AS valtraduite_no2,\n",
+ " MAX(\n",
+ " CASE\n",
+ " WHEN\n",
+ " resultats.cdparametresiseeaux = 'NO3_NO2'\n",
+ " THEN resultats.valtraduite\n",
+ " END\n",
+ " ) AS valtraduite_no3_no2\n",
+ " FROM\n",
+ " last_pvl\n",
+ " LEFT JOIN\n",
+ " int__resultats_udi_communes AS resultats\n",
+ " ON\n",
+ " resultats.cdreseau = last_pvl.cdreseau\n",
+ " AND resultats.referenceprel = last_pvl.referenceprel\n",
+ " WHERE\n",
+ " last_pvl.row_number = 1 \n",
+ " -- on ne veut que le dernier prélèvement\n",
+ " AND resultats.categorie = 'nitrate' \n",
+ " -- on ne veut que les résultats associé aux nitrates/nitrites\n",
+ " GROUP BY\n",
+ " resultats.cdreseau,\n",
+ " resultats.categorie,\n",
+ " resultats.datetimeprel\n",
+ "),\n",
+ "\n",
+ "split_nitrites_with_ref AS (\n",
+ " SELECT\n",
+ " split_nitrites.cdreseau,\n",
+ " split_nitrites.categorie,\n",
+ " split_nitrites.nb_parametres,\n",
+ " split_nitrites.dernier_prel_datetime,\n",
+ " valeur_ref.limite_qualite_no3,\n",
+ " valeur_ref.limite_qualite_no2,\n",
+ " valeur_ref.limite_qualite_no3_no2,\n",
+ " split_nitrites.valtraduite_no3_no2,\n",
+ " split_nitrites.valtraduite_no3,\n",
+ " split_nitrites.valtraduite_no2\n",
+ " FROM\n",
+ " split_nitrites\n",
+ " CROSS JOIN\n",
+ " valeur_ref\n",
+ ") \n",
+ " \n",
+ "SELECT \n",
+ " *,\n",
+ " CASE\n",
+ " WHEN -- Si nitrates (no3) et pas nitrites (no2)\n",
+ " split_nitrites_with_ref.valtraduite_no3 IS NOT NULL \n",
+ " AND split_nitrites_with_ref.valtraduite_no2 IS NULL\n",
+ " AND\n",
+ " split_nitrites_with_ref.valtraduite_no3\n",
+ " < split_nitrites_with_ref.limite_qualite_no3\n",
+ " THEN 'inf_limite_qualite'\n",
+ " WHEN\n",
+ " split_nitrites_with_ref.valtraduite_no3 IS NOT NULL \n",
+ " AND split_nitrites_with_ref.valtraduite_no2 IS NULL\n",
+ " AND\n",
+ " split_nitrites_with_ref.valtraduite_no3\n",
+ " >= split_nitrites_with_ref.limite_qualite_no3\n",
+ " THEN 'sup_limite_qualite'\n",
+ " WHEN -- Si nitrates (no3) ET nitrites (no2)\n",
+ " split_nitrites_with_ref.valtraduite_no3 IS NOT NULL\n",
+ " AND split_nitrites_with_ref.valtraduite_no2 IS NOT NULL\n",
+ " AND (\n",
+ " split_nitrites_with_ref.valtraduite_no3\n",
+ " >= split_nitrites_with_ref.limite_qualite_no3\n",
+ " OR split_nitrites_with_ref.valtraduite_no2\n",
+ " >= split_nitrites_with_ref.limite_qualite_no2\n",
+ " OR COALESCE(\n",
+ " split_nitrites_with_ref.valtraduite_no3_no2,\n",
+ " (\n",
+ " split_nitrites_with_ref.valtraduite_no3 / 50\n",
+ " + split_nitrites_with_ref.valtraduite_no2 / 3\n",
+ " )\n",
+ " )\n",
+ " >= split_nitrites_with_ref.limite_qualite_no3_no2\n",
+ " )\n",
+ " THEN 'sup_limite_qualite'\n",
+ " WHEN\n",
+ " split_nitrites_with_ref.valtraduite_no3 IS NOT NULL\n",
+ " AND split_nitrites_with_ref.valtraduite_no2 IS NOT NULL\n",
+ " AND split_nitrites_with_ref.valtraduite_no3\n",
+ " < split_nitrites_with_ref.limite_qualite_no3\n",
+ " AND split_nitrites_with_ref.valtraduite_no2\n",
+ " < split_nitrites_with_ref.limite_qualite_no2\n",
+ " AND COALESCE(\n",
+ " split_nitrites_with_ref.valtraduite_no3_no2,\n",
+ " (\n",
+ " split_nitrites_with_ref.valtraduite_no3 / 50\n",
+ " + split_nitrites_with_ref.valtraduite_no2 / 3\n",
+ " )\n",
+ " )\n",
+ " < split_nitrites_with_ref.limite_qualite_no3_no2\n",
+ " THEN 'inf_limite_qualite'\n",
+ " ELSE 'erreur'\n",
+ " END AS resultat\n",
+ "FROM\n",
+ " split_nitrites_with_ref\n",
+ "WHERE\n",
+ " cdreseau IN( '002000060','095000346','001000003','976003554','088002296','073002059','973000028','001000260','001000268','001000293','008000681','008000546')\n",
+ "ORDER BY \n",
+ " cdreseau"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "2137dd22-ec22-4b37-93ee-30b75c06ad42",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "Running query in 'duckdb:///../../database/data.duckdb'"
+ ],
+ "text/plain": [
+ "Running query in 'duckdb:///../../database/data.duckdb'"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "2ee8d4f0d01b40d18f8980a9126ab1b5",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "FloatProgress(value=0.0, layout=Layout(width='auto'), style=ProgressStyle(bar_color='black'))"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " cdreseau | \n",
+ " categorie | \n",
+ " periode | \n",
+ " dernier_prel_datetime | \n",
+ " nb_parametres | \n",
+ " resultat | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 001000003 | \n",
+ " nitrate | \n",
+ " dernier_prel | \n",
+ " 2025-01-21 12:35:00 | \n",
+ " 3 | \n",
+ " inf_limite_qualite | \n",
+ "
\n",
+ " \n",
+ " 001000260 | \n",
+ " nitrate | \n",
+ " dernier_prel | \n",
+ " 2024-12-06 12:02:00 | \n",
+ " 3 | \n",
+ " inf_limite_qualite | \n",
+ "
\n",
+ " \n",
+ " 001000268 | \n",
+ " nitrate | \n",
+ " dernier_prel | \n",
+ " 2025-01-13 09:57:00 | \n",
+ " 3 | \n",
+ " inf_limite_qualite | \n",
+ "
\n",
+ " \n",
+ " 001000293 | \n",
+ " nitrate | \n",
+ " dernier_prel | \n",
+ " 2025-01-28 11:29:00 | \n",
+ " 3 | \n",
+ " inf_limite_qualite | \n",
+ "
\n",
+ " \n",
+ " 002000060 | \n",
+ " nitrate | \n",
+ " dernier_prel | \n",
+ " 2024-10-18 08:50:00 | \n",
+ " 2 | \n",
+ " sup_limite_qualite | \n",
+ "
\n",
+ " \n",
+ " 008000546 | \n",
+ " nitrate | \n",
+ " dernier_prel | \n",
+ " 2025-02-07 10:38:00 | \n",
+ " 1 | \n",
+ " sup_limite_qualite | \n",
+ "
\n",
+ " \n",
+ " 008000681 | \n",
+ " nitrate | \n",
+ " dernier_prel | \n",
+ " 2025-02-12 11:38:00 | \n",
+ " 1 | \n",
+ " sup_limite_qualite | \n",
+ "
\n",
+ " \n",
+ " 095000346 | \n",
+ " nitrate | \n",
+ " dernier_prel | \n",
+ " 2025-02-27 08:35:00 | \n",
+ " 1 | \n",
+ " inf_limite_qualite | \n",
+ "
\n",
+ " \n",
+ " 973000028 | \n",
+ " nitrate | \n",
+ " dernier_prel | \n",
+ " 2024-12-02 11:30:00 | \n",
+ " 2 | \n",
+ " inf_limite_qualite | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ "+-----------+-----------+--------------+-----------------------+---------------+--------------------+\n",
+ "| cdreseau | categorie | periode | dernier_prel_datetime | nb_parametres | resultat |\n",
+ "+-----------+-----------+--------------+-----------------------+---------------+--------------------+\n",
+ "| 001000003 | nitrate | dernier_prel | 2025-01-21 12:35:00 | 3 | inf_limite_qualite |\n",
+ "| 001000260 | nitrate | dernier_prel | 2024-12-06 12:02:00 | 3 | inf_limite_qualite |\n",
+ "| 001000268 | nitrate | dernier_prel | 2025-01-13 09:57:00 | 3 | inf_limite_qualite |\n",
+ "| 001000293 | nitrate | dernier_prel | 2025-01-28 11:29:00 | 3 | inf_limite_qualite |\n",
+ "| 002000060 | nitrate | dernier_prel | 2024-10-18 08:50:00 | 2 | sup_limite_qualite |\n",
+ "| 008000546 | nitrate | dernier_prel | 2025-02-07 10:38:00 | 1 | sup_limite_qualite |\n",
+ "| 008000681 | nitrate | dernier_prel | 2025-02-12 11:38:00 | 1 | sup_limite_qualite |\n",
+ "| 095000346 | nitrate | dernier_prel | 2025-02-27 08:35:00 | 1 | inf_limite_qualite |\n",
+ "| 973000028 | nitrate | dernier_prel | 2024-12-02 11:30:00 | 2 | inf_limite_qualite |\n",
+ "+-----------+-----------+--------------+-----------------------+---------------+--------------------+"
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "%%sql --with int__resultats_nitrites_udi_dernier \n",
+ " SELECT \n",
+ " *\n",
+ " FROM\n",
+ " int__resultats_nitrites_udi_dernier\n",
+ "WHERE\n",
+ " cdreseau IN( '002000060','095000346','001000003','976003554','088002296','073002059','973000028','001000260','001000268','001000293','008000681','008000546')\n",
+ "ORDER BY \n",
+ " cdreseau"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "id": "4033d129-eeab-4ec9-ac40-39a4101e3083",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "Running query in 'duckdb:///../../database/data.duckdb'"
+ ],
+ "text/plain": [
+ "Running query in 'duckdb:///../../database/data.duckdb'"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "bdc2fedf16ea411382a0c221d42c4667",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "FloatProgress(value=0.0, layout=Layout(width='auto'), style=ProgressStyle(bar_color='black'))"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " cdreseau | \n",
+ " categorie | \n",
+ " periode | \n",
+ " dernier_prel_datetime | \n",
+ " nb_parametres | \n",
+ " resultat | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ "+----------+-----------+---------+-----------------------+---------------+----------+\n",
+ "| cdreseau | categorie | periode | dernier_prel_datetime | nb_parametres | resultat |\n",
+ "+----------+-----------+---------+-----------------------+---------------+----------+\n",
+ "+----------+-----------+---------+-----------------------+---------------+----------+"
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "%%sql --with int__resultats_nitrites_udi_dernier\n",
+ "-- dernier relevé\n",
+ "SELECT\n",
+ "*\n",
+ "FROM\n",
+ " int__resultats_nitrites_udi_dernier\n",
+ "WHERE\n",
+ " (\n",
+ " cdreseau = '001000003'\n",
+ " AND categorie = 'nitrate'\n",
+ " AND dernier_prel_datetime = '2025-01-21 12:35:00'\n",
+ " AND resultat != 'inf_limite_qualite'\n",
+ " )\n",
+ " OR\n",
+ " (\n",
+ " cdreseau = '001000260'\n",
+ " AND categorie = 'nitrate'\n",
+ " AND dernier_prel_datetime = '2024-12-06 12:02:00'\n",
+ " AND resultat != 'inf_limite_qualite'\n",
+ " )\n",
+ " OR\n",
+ " (\n",
+ " cdreseau = '001000268'\n",
+ " AND categorie = 'nitrate'\n",
+ " AND dernier_prel_datetime = '2025-01-13 09:57:00'\n",
+ " AND resultat != 'inf_limite_qualite'\n",
+ " )\n",
+ " OR\n",
+ " (\n",
+ " cdreseau = '002000060'\n",
+ " AND categorie = 'nitrate'\n",
+ " AND dernier_prel_datetime = '2024-10-18 08:50:00'\n",
+ " AND resultat != 'sup_limite_qualite'\n",
+ " )\n",
+ " OR\n",
+ " (\n",
+ " cdreseau = '095000346'\n",
+ " AND categorie = 'nitrate'\n",
+ " AND dernier_prel_datetime = '2025-02-27 08:35:00'\n",
+ " AND resultat != 'inf_limite_qualite'\n",
+ " )\n",
+ " OR\n",
+ " (\n",
+ " cdreseau = '973000028'\n",
+ " AND categorie = 'nitrate'\n",
+ " AND dernier_prel_datetime = '2024-12-02 11:30:00'\n",
+ " AND resultat != 'inf_limite_qualite'\n",
+ " )\n",
+ " OR\n",
+ " (\n",
+ " cdreseau = '008000681'\n",
+ " AND categorie = 'nitrate'\n",
+ " AND dernier_prel_datetime = '2025-02-12 11:38:00'\n",
+ " AND resultat != 'sup_limite_qualite'\n",
+ " )\n",
+ " OR\n",
+ " (\n",
+ " cdreseau = '008000546'\n",
+ " AND categorie = 'nitrate'\n",
+ " AND dernier_prel_datetime = '2025-02-07 10:38:00'\n",
+ " AND resultat != 'sup_limite_qualite'\n",
+ " )"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "35aaf65c-8ba7-437e-bcbf-5fbed491bc39",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.12.9"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/dbt_/models/intermediate/_int__models.yml b/dbt_/models/intermediate/_int__models.yml
index 8ac4a3e8..e6f7c987 100644
--- a/dbt_/models/intermediate/_int__models.yml
+++ b/dbt_/models/intermediate/_int__models.yml
@@ -13,7 +13,7 @@ models:
tests:
- unique
- name: categorie
- description: "Catégorie du paramètre (pesticides, nitrites, etc.)"
+ description: "Catégorie du paramètre (pesticides, nitrate, etc.)"
type: VARCHAR
- name: nb_categorie
description: Nombre unique categorie à cdparametresiseeaux - DOIT être égal à 1
@@ -136,6 +136,7 @@ models:
- name: cdreseau
description: "Code de l'installation (unité de distribution)"
+ type: VARCHAR
tests:
- not_null
@@ -166,6 +167,7 @@ models:
columns:
- name: cdreseau
description: "Code de l'installation (unité de distribution)"
+ type: VARCHAR
tests:
- not_null
@@ -266,6 +268,7 @@ models:
- name: cdreseau
description: "Code de l'installation (unité de distribution)"
+ type: VARCHAR
tests:
- not_null
@@ -375,6 +378,7 @@ models:
columns:
- name: cdreseau
description: "Code de l'installation (unité de distribution)"
+ type: VARCHAR
tests:
- not_null
- name: periode
diff --git a/dbt_/models/intermediate/cvm/_int__cvm_models.yaml b/dbt_/models/intermediate/cvm/_int__cvm_models.yaml
index e80412e7..99ccb694 100644
--- a/dbt_/models/intermediate/cvm/_int__cvm_models.yaml
+++ b/dbt_/models/intermediate/cvm/_int__cvm_models.yaml
@@ -17,6 +17,7 @@ models:
type: SMALLINT
- name: categorie
description: "Catégorie du paramètre (pesticides, pfas, vcm, nitrates, etc.) selon la classification établie."
+ type: VARCHAR
tests:
- accepted_values:
values: ["cvm"]
@@ -27,7 +28,11 @@ models:
- dbt_utils.expression_is_true:
expression: "LIKE 'bilan_annuel%'"
- name: nb_depassements
+ description: "Nombre de prélèvements qui dépassent la valeur de référence"
+ type: INTEGER
- name: nb_prelevements
+ description: "Nombre de prélèvements total"
+ type: INTEGER
- name: ratio_limite_qualite
description: "Pourcentage de prélèvements qui dépassent la limite"
type: FLOAT
@@ -45,26 +50,34 @@ models:
- not_null
- unique
- name: categorie
+ description: "Catégorie du paramètre (pesticides, pfas, vcm, nitrates, etc.) selon la classification établie."
+ type: VARCHAR
tests:
- not_null
- name: periode
+ description: "Période du résultat"
type: VARCHAR
tests:
- accepted_values:
values: ["dernier_prel"]
- name: dernier_prel_datetime
+ description: "Date du dernier prélèvement considéré"
type: TIMESTAMP
tests:
- not_null
- dbt_utils.expression_is_true:
expression: ">= CURRENT_DATE - INTERVAL 1 YEAR"
- name: dernier_prel_valeur
+ description: "valeur mesurée sur le dernier prélèvement considéré"
type: FLOAT
- name: nb_parametres
+ description: "nombre de paramètres mesurés sur le prélèvement pour la catégorie considérée"
type: INTEGER
tests:
- not_null
- name: resultat
+ description: "classification de la substance pour le prélèvement"
+ type: VARCHAR
tests:
- not_null
- accepted_values:
@@ -83,6 +96,7 @@ models:
columns:
- name: cdreseau
description: "Code de l'installation (unité de distribution)"
+ type: VARCHAR
tests:
- not_null
- name: annee
@@ -90,6 +104,7 @@ models:
type: SMALLINT
- name: categorie
description: "Catégorie du paramètre (pesticides, pfas, vcm, nitrates, etc.) selon la classification établie."
+ type: VARCHAR
tests:
- accepted_values:
values: ["cvm"]
@@ -100,7 +115,11 @@ models:
- dbt_utils.expression_is_true:
expression: "LIKE 'bilan_annuel%'"
- name: nb_depassements
+ description: "Nombre de prélèvements qui dépassent la valeur de référence"
+ type: INTEGER
- name: nb_prelevements
+ description: "Nombre de prélèvements total"
+ type: INTEGER
- name: ratio_limite_qualite
description: "Pourcentage de prélèvements qui dépassent la limite"
type: FLOAT
@@ -114,30 +133,40 @@ models:
description: Resultats CVM par UDI pour la temporalité 'derniers prélèvements'
columns:
- name: cdreseau
+ description: "Code de l'installation (unité de distribution)"
+ type: VARCHAR
tests:
- not_null
- unique
- name: categorie
+ description: "Catégorie du paramètre (pesticides, pfas, vcm, nitrates, etc.) selon la classification établie."
+ type: VARCHAR
tests:
- not_null
- name: periode
+ description: "Période du résultat"
type: VARCHAR
tests:
- accepted_values:
values: ["dernier_prel"]
- name: dernier_prel_datetime
+ description: "Date du dernier prélèvement considéré"
type: TIMESTAMP
tests:
- not_null
- dbt_utils.expression_is_true:
expression: ">= CURRENT_DATE - INTERVAL 1 YEAR"
- name: dernier_prel_valeur
+ description: "Valeur du dernier prelevement"
type: FLOAT
- name: nb_parametres
+ description: "Nombre de paramètres analysés"
type: INTEGER
tests:
- not_null
- name: resultat
+ description: "Interprétation du résultat en fonction des seuils et des valeurs mesurées."
+ type: VARCHAR
tests:
- not_null
- accepted_values:
diff --git a/dbt_/models/intermediate/cvm/int__resultats_cvm_commune_dernier.sql b/dbt_/models/intermediate/cvm/int__resultats_cvm_commune_dernier.sql
index 9a4c39be..c43640d1 100644
--- a/dbt_/models/intermediate/cvm/int__resultats_cvm_commune_dernier.sql
+++ b/dbt_/models/intermediate/cvm/int__resultats_cvm_commune_dernier.sql
@@ -40,7 +40,7 @@ SELECT
WHEN
last_pvl.valtraduite < last_pvl.limite_qualite
THEN 'inf_0_5'
- ELSE 'error'
+ ELSE 'erreur'
END AS resultat
FROM
last_pvl
diff --git a/dbt_/models/intermediate/cvm/int__resultats_cvm_udi_dernier.sql b/dbt_/models/intermediate/cvm/int__resultats_cvm_udi_dernier.sql
index f0a27007..c553b684 100644
--- a/dbt_/models/intermediate/cvm/int__resultats_cvm_udi_dernier.sql
+++ b/dbt_/models/intermediate/cvm/int__resultats_cvm_udi_dernier.sql
@@ -40,7 +40,7 @@ SELECT
WHEN
last_pvl.valtraduite < last_pvl.limite_qualite
THEN 'inf_0_5'
- ELSE 'error'
+ ELSE 'erreur'
END AS resultat
FROM
last_pvl
diff --git a/dbt_/models/intermediate/int__union_resultats_udi.sql b/dbt_/models/intermediate/int__union_resultats_udi.sql
index 4ae1ab52..893ece6a 100644
--- a/dbt_/models/intermediate/int__union_resultats_udi.sql
+++ b/dbt_/models/intermediate/int__union_resultats_udi.sql
@@ -101,3 +101,18 @@ SELECT
null AS nb_sup_valeur_sanitaire
FROM
{{ ref('int__resultats_sub_indus_udi_dernier') }}
+UNION ALL
+-- nitrate
+SELECT
+ cdreseau,
+ periode,
+ categorie,
+ resultat,
+ null AS ratio,
+ dernier_prel_datetime,
+ dernier_prel_valeur,
+ nb_parametres,
+ null AS nb_prelevements,
+ null AS nb_sup_valeur_sanitaire
+FROM
+ {{ ref('int__resultats_nitrate_udi_dernier') }}
diff --git a/dbt_/models/intermediate/nitrate/_int__nitrate_models.yaml b/dbt_/models/intermediate/nitrate/_int__nitrate_models.yaml
new file mode 100644
index 00000000..e56cb009
--- /dev/null
+++ b/dbt_/models/intermediate/nitrate/_int__nitrate_models.yaml
@@ -0,0 +1,47 @@
+version: 2
+
+models:
+ - name: int__resultats_nitrate_udi_dernier
+ description: Resultats nitrate par UDI pour la temporalité 'derniers prélèvements'
+ columns:
+ - name: cdreseau
+ description: "Code de l'installation (unité de distribution)"
+ type: VARCHAR
+ tests:
+ - not_null
+ - unique
+ - name: categorie
+ description: "Catégorie du paramètre (pesticides, pfas, vcm, nitrates, etc.) selon la classification établie."
+ type: VARCHAR
+ tests:
+ - not_null
+ - accepted_values:
+ values: ["nitrate"]
+ - name: periode
+ description: "Période du résultat"
+ type: VARCHAR
+ tests:
+ - accepted_values:
+ values: ["dernier_prel"]
+ - name: dernier_prel_datetime
+ description: "Date du dernier prélèvement considéré"
+ type: TIMESTAMP
+ tests:
+ - not_null
+ - dbt_utils.expression_is_true:
+ expression: ">= CURRENT_DATE - INTERVAL 1 YEAR"
+ - name: dernier_prel_valeur
+ description: "Valeur du dernier prelevement"
+ type: FLOAT
+ - name: nb_parametres
+ description: "Nombre de paramètres analysés"
+ type: INTEGER
+ - name: resultat
+ description: "Interprétation du résultat en fonction des seuils et des valeurs mesurées."
+ type: VARCHAR
+ tests:
+ - not_null
+ - accepted_values:
+ values:
+ - inf_limite_qualite
+ - sup_limite_qualite
diff --git a/dbt_/models/intermediate/nitrate/int__resultats_nitrate_udi_dernier.sql b/dbt_/models/intermediate/nitrate/int__resultats_nitrate_udi_dernier.sql
new file mode 100644
index 00000000..8bf32f51
--- /dev/null
+++ b/dbt_/models/intermediate/nitrate/int__resultats_nitrate_udi_dernier.sql
@@ -0,0 +1,171 @@
+WITH
+last_pvl AS (
+ SELECT
+ cdreseau,
+ referenceprel,
+ datetimeprel,
+ ROW_NUMBER()
+ OVER (
+ PARTITION BY cdreseau
+ ORDER BY datetimeprel DESC
+ )
+ AS row_number
+ FROM
+ {{ ref('int__resultats_udi_communes') }}
+ WHERE
+ categorie = 'nitrate'
+ AND cdparametresiseeaux = 'NO3'
+ AND -- On garde les prélèvements de moins d'un an
+ CURRENT_DATE - datetimeprel < INTERVAL 1 YEAR
+ AND valtraduite IS NOT NULL
+ -- Cf cas cdreseau IN( '034005906') , referenceprel= 03400327764
+),
+
+valeur_ref AS (
+ SELECT
+ MAX(
+ CASE
+ WHEN
+ cdparametresiseeaux = 'NO3'
+ THEN limite_qualite
+ END
+ ) AS limite_qualite_no3,
+ MAX(
+ CASE
+ WHEN
+ cdparametresiseeaux = 'NO3_NO2'
+ THEN limite_qualite
+ END
+ ) AS limite_qualite_no3_no2,
+ MAX(
+ CASE
+ WHEN
+ cdparametresiseeaux = 'NO2'
+ THEN limite_qualite
+ END
+ ) AS limite_qualite_no2
+ FROM
+ {{ ref('int__valeurs_de_reference') }}
+ WHERE
+ categorie_1 = 'nitrate'
+),
+
+split_nitrate AS (
+ SELECT
+ resultats.cdreseau,
+ resultats.categorie,
+ resultats.datetimeprel AS dernier_prel_datetime,
+ COUNT(DISTINCT resultats.cdparametresiseeaux) AS nb_parametres,
+ MAX(
+ CASE
+ WHEN
+ resultats.cdparametresiseeaux = 'NO3'
+ THEN resultats.valtraduite
+ END
+ ) AS valtraduite_no3,
+ MAX(
+ CASE
+ WHEN
+ resultats.cdparametresiseeaux = 'NO2'
+ THEN resultats.valtraduite
+ END
+ ) AS valtraduite_no2,
+ MAX(
+ CASE
+ WHEN
+ resultats.cdparametresiseeaux = 'NO3_NO2'
+ THEN resultats.valtraduite
+ END
+ ) AS valtraduite_no3_no2
+ FROM
+ last_pvl
+ LEFT JOIN
+ {{ ref('int__resultats_udi_communes') }} AS resultats
+ ON
+ last_pvl.cdreseau = resultats.cdreseau
+ AND last_pvl.referenceprel = resultats.referenceprel
+ WHERE
+ last_pvl.row_number = 1
+ -- on ne veut que le dernier prélèvement
+ AND resultats.categorie = 'nitrate'
+ -- on ne veut que les résultats associé aux nitrates/nitrites
+ GROUP BY
+ resultats.cdreseau,
+ resultats.categorie,
+ resultats.datetimeprel
+),
+
+split_nitrate_with_ref AS (
+ SELECT
+ split_nitrate.cdreseau,
+ split_nitrate.categorie,
+ split_nitrate.nb_parametres,
+ split_nitrate.dernier_prel_datetime,
+ valeur_ref.limite_qualite_no3,
+ valeur_ref.limite_qualite_no2,
+ valeur_ref.limite_qualite_no3_no2,
+ split_nitrate.valtraduite_no3_no2,
+ split_nitrate.valtraduite_no3,
+ split_nitrate.valtraduite_no2
+ FROM
+ split_nitrate
+ CROSS JOIN
+ valeur_ref
+)
+
+SELECT
+ cdreseau,
+ categorie,
+ 'dernier_prel' AS periode,
+ dernier_prel_datetime,
+ valtraduite_no3 AS dernier_prel_valeur,
+ nb_parametres,
+ CASE
+ WHEN -- Si nitrates (no3) et pas nitrites (no2)
+ valtraduite_no2 IS NULL
+ AND
+ valtraduite_no3
+ < limite_qualite_no3
+ THEN 'inf_limite_qualite'
+ WHEN
+ valtraduite_no2 IS NULL
+ AND
+ valtraduite_no3
+ >= limite_qualite_no3
+ THEN 'sup_limite_qualite'
+ WHEN -- Si nitrates (no3) ET nitrites (no2)
+ valtraduite_no2 IS NOT NULL
+ AND (
+ valtraduite_no3
+ >= limite_qualite_no3
+ OR valtraduite_no2
+ >= limite_qualite_no2
+ OR COALESCE(
+ valtraduite_no3_no2,
+ (
+ valtraduite_no3 / 50
+ + valtraduite_no2 / 3
+ )
+ )
+ >= limite_qualite_no3_no2
+ )
+ THEN 'sup_limite_qualite'
+ WHEN
+ valtraduite_no2 IS NOT NULL
+ AND valtraduite_no3
+ < limite_qualite_no3
+ AND valtraduite_no2
+ < limite_qualite_no2
+ AND COALESCE(
+ valtraduite_no3_no2,
+ (
+ valtraduite_no3 / 50
+ + valtraduite_no2 / 3
+ )
+ )
+ < limite_qualite_no3_no2
+ THEN 'inf_limite_qualite'
+ ELSE 'erreur'
+ END AS resultat
+FROM
+ split_nitrate_with_ref
diff --git a/dbt_/tests/test_nitrates_results.sql b/dbt_/tests/test_nitrates_results.sql
new file mode 100644
index 00000000..68c82206
--- /dev/null
+++ b/dbt_/tests/test_nitrates_results.sql
@@ -0,0 +1,64 @@
+-- dernier relevé
+SELECT
+ 'dernier relevé' AS periode,
+ cdreseau,
+ resultat,
+ 0 AS nb_depassements,
+ 0 AS nb_prelevements,
+ 0 AS ratio_depassements
+FROM
+ {{ ref('int__resultats_nitrate_udi_dernier') }}
+WHERE
+ (
+ cdreseau = '001000003'
+ AND dernier_prel_datetime = '2025-01-21 12:35:00'
+ AND resultat != 'inf_limite_qualite'
+ )
+ OR
+ (
+ cdreseau = '001000260'
+ AND dernier_prel_datetime = '2024-12-06 12:02:00'
+ AND resultat != 'inf_limite_qualite'
+ )
+ OR
+ (
+ cdreseau = '001000268'
+ AND dernier_prel_datetime = '2025-01-13 09:57:00'
+ AND resultat != 'inf_limite_qualite'
+ )
+ OR
+ (
+ cdreseau = '002000060'
+ AND dernier_prel_datetime = '2024-10-18 08:50:00'
+ AND resultat != 'sup_limite_qualite'
+ )
+ OR
+ (
+ cdreseau = '095000346'
+ AND dernier_prel_datetime = '2025-02-27 08:35:00'
+ AND resultat != 'inf_limite_qualite'
+ )
+ OR
+ (
+ cdreseau = '973000028'
+ AND dernier_prel_datetime = '2024-12-02 11:30:00'
+ AND resultat != 'inf_limite_qualite'
+ )
+ OR
+ (
+ cdreseau = '008000681'
+ AND dernier_prel_datetime = '2025-02-12 11:38:00'
+ AND resultat != 'sup_limite_qualite'
+ )
+ OR
+ (
+ cdreseau = '008000546'
+ AND dernier_prel_datetime = '2025-02-07 10:38:00'
+ AND resultat != 'sup_limite_qualite'
+ )
+ OR
+ (
+ cdreseau = '011000196'
+ AND dernier_prel_datetime = '2024-11-27 10:57:00'
+ AND resultat != 'inf_limite_qualite'
+ )
diff --git a/webapp/components/PollutionMapBase.tsx b/webapp/components/PollutionMapBase.tsx
index ab577069..e47b0aa2 100644
--- a/webapp/components/PollutionMapBase.tsx
+++ b/webapp/components/PollutionMapBase.tsx
@@ -128,8 +128,8 @@ export default function PollutionMapBaseLayer({
["zoom"],
0,
0.0, // At zoom level 0, line width is 0px
- 6,
- 0.0, // At zoom level 6, line width is 0px
+ 7,
+ 0.0, // At zoom level 7, line width is 0px
20,
2.0, // At zoom level 20, line width is 2.0px
],