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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
anneenb_prelevementsnb_dep_3critèrespercent_3critèresnb_prelevements_n02nb_dep_n02percent_n02nb_prelevements_n03nb_dep_n03percent_n03
202012938617451.0129385270.012938117031.0
2025181382851.01813810.0176812831.0
202112649318231.0126487170.012649018021.0
202212874516051.0128736160.012873715861.0
202412773419801.0127733160.012773319601.0
202312917214471.0129171350.012915414051.0
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cdparametresiseeauxcategorie_1categorie_2categorie_3limite_qualitelimite_qualite_unitevaleur_sanitaire_1valeur_sanitaire_1_unitevaleur_sanitaire_2valeur_sanitaire_2_unitenb_rows
NO3nitrateNoneNone50.0mg/LNoneNoneNoneNone1
NO2nitrateNoneNone0.5mg/LNoneNoneNoneNone1
NO3_NO2nitrateNoneNone1.0NoneNoneNoneNoneNone1
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
limite_qualite_no3limite_qualite_no3_no2limite_qualite_no2
50.01.00.5
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cdreseaucategorieperiodedernier_prel_datetimenb_parametresresultat
043000382nitratedernier_prel2024-08-21 11:04:003inf_limite_qualite
048000421nitratedernier_prel2024-05-23 12:04:002inf_limite_qualite
055000098nitratedernier_prel2024-08-05 08:48:003inf_limite_qualite
066000236nitratedernier_prel2024-06-19 10:33:002inf_limite_qualite
066000312nitratedernier_prel2024-10-29 10:32:002inf_limite_qualite
067001856nitratedernier_prel2024-12-06 08:15:003inf_limite_qualite
068001002nitratedernier_prel2024-10-28 09:40:002inf_limite_qualite
073001318nitratedernier_prel2024-12-19 09:35:003inf_limite_qualite
073001176nitratedernier_prel2024-08-28 11:59:003inf_limite_qualite
080000913nitratedernier_prel2024-11-28 14:38:003inf_limite_qualite
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
resultatcount_star()
inf_limite_qualite21184
sup_limite_qualite224
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cdreseaucategorieperiodedernier_prel_datetimenb_parametresresultat
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
referenceprelcdparametresiseeauxde_partitionvaltraduitecategoriecategorie_2categorie_3limite_qualitevaleur_sanitaire_1valeur_sanitaire_2cdreseauinseecommunedatetimeprelrow_number
03400327273NO32025NonenitrateNoneNone50.0NoneNone034005906340882025-01-31 09:34:009
03400327273NO32025NonenitrateNoneNone50.0NoneNone034005906340872025-01-31 09:34:0010
03400327275NO32025NonenitrateNoneNone50.0NoneNone034005906340882025-01-28 07:50:0011
03400327275NO32025NonenitrateNoneNone50.0NoneNone034005906340872025-01-28 07:50:0012
03400327272NO32025NonenitrateNoneNone50.0NoneNone034005906340882025-01-08 10:17:0013
03400327272NO32025NonenitrateNoneNone50.0NoneNone034005906340872025-01-08 10:17:0014
03400316443NO320243.000nitrateNoneNone50.0NoneNone034005906340872024-12-03 09:23:0015
03400316443NO320243.000nitrateNoneNone50.0NoneNone034005906340882024-12-03 09:23:0016
03400327764NO32025NonenitrateNoneNone50.0NoneNone034005906340882025-02-21 10:16:001
03400327764NO32025NonenitrateNoneNone50.0NoneNone034005906340872025-02-21 10:16:002
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
resultatmin_cdreseaumax_cdreseau
sup_limite_qualite002000060089003505
inf_limite_qualite001000003976003881
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cdreseaucategorienb_parametresdernier_prel_datetimelimite_qualite_no3limite_qualite_no2limite_qualite_no3_no2valtraduite_no3_no2valtraduite_no3valtraduite_no2resultat
001000003nitrate32025-01-21 12:35:0050.00.51.00.28014.0000.000inf_limite_qualite
001000260nitrate32024-12-06 12:02:0050.00.51.00.0502.4000.000inf_limite_qualite
001000268nitrate32025-01-13 09:57:0050.00.51.00.1206.0000.000inf_limite_qualite
001000293nitrate32025-01-28 11:29:0050.00.51.00.0703.7000.000inf_limite_qualite
002000060nitrate22024-10-18 08:50:0050.00.51.0None59.3000.000sup_limite_qualite
095000346nitrate12025-02-27 08:35:0050.00.51.0None47.000Noneinf_limite_qualite
973000028nitrate22024-12-02 11:30:0050.00.51.0None0.0000.000inf_limite_qualite
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cdreseaucategorieperiodedernier_prel_datetimenb_parametresresultat
001000003nitratedernier_prel2025-01-21 12:35:003inf_limite_qualite
001000260nitratedernier_prel2024-12-06 12:02:003inf_limite_qualite
001000268nitratedernier_prel2025-01-13 09:57:003inf_limite_qualite
001000293nitratedernier_prel2025-01-28 11:29:003inf_limite_qualite
002000060nitratedernier_prel2024-10-18 08:50:002sup_limite_qualite
008000546nitratedernier_prel2025-02-07 10:38:001sup_limite_qualite
008000681nitratedernier_prel2025-02-12 11:38:001sup_limite_qualite
095000346nitratedernier_prel2025-02-27 08:35:001inf_limite_qualite
973000028nitratedernier_prel2024-12-02 11:30:002inf_limite_qualite
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cdreseaucategorieperiodedernier_prel_datetimenb_parametresresultat
" + ], + "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 ],