Voir Exemples de requêtes SQL pour les explications sur l'utilisation des requêtes SQL.
Liste des requêtes disponibles :
- Liste des élèves par établissement, avec autorisation parentale par maladie, sélection des départements et état des vaccination HPV, méningocoques, ROR, DTCP et hépatite B
- Liste des collèges avec pour chaque collège le nombre d'élèves concernés et le nombre de doses à prévoir
- Liste des dossiers créés depuis le 01/01/2025 avec tag « hpv2425 »
- Liste des patientes ayant reçu les 2 premières doses de GARDASIL 9 avec moins de 5 mois d'écart (schéma invalide)
- Liste des patients, tous sexes confondus, ayant reçu au moins une dose de GARDASIL 9, avec indication de la conformité du schéma vaccinal
Liste des élèves par établissement, avec autorisation parentale par maladie, sélection des départements et état des vaccination HPV, méningocoques, ROR, DTCP et hépatite B
Le but : produire une liste des collégiens, classés par collège, puis par classe, et enfin par ordre alphabétique. Pour chaque élève :
- afficher l’identité (nom, prénom, sexe, date de naissance, âge le jour de la requête), le code UAI et le nom du collège, ainsi que la classe de l'élève ;
- Ne pas inclure dans la liste les élèves ayant le tag « exclusion » ;
- indiquer, pour chaque maladie concernée par les campagnes vaccinales, si un accord parental est présent (✓) ou non ;
- afficher le nombre de doses de Gardasil 9 reçues, la date de la dernière dose, ainsi qu’un marqueur de schéma vaccinal valide (✓ : 2 doses ou plus, avec un intervalle d’au moins 5 mois entre les deux dernières doses) ;
- afficher la date de la dernière dose de vaccin contre les méningocoques ACWY, l’âge auquel elle a été administrée, et un marqueur de schéma valide (✓ : dernière dose administrée après l’âge de 11 ans, avec une tolérance de 6 mois, soit 123 mois) ;
- afficher le nombre de doses du vaccin ROR, la date de la dernière dose reçue, et un marqueur de schéma valide (✓ : 2 doses administrées à partir de l’âge de 12 mois, ou 3 doses à partir de 6 mois) ;
- afficher la date de la dernière dose reçue de vaccin DTCP, l’âge auquel elle a été administrée, et un marqueur de schéma valide (✓ : dernière dose administrée après l’âge de 11 ans, avec une tolérance de 6 mois, soit 126 mois) ;
- afficher le nombre de doses du vaccin contre l’hépatite B, la date de la dernière dose reçue, et un marqueur de schéma valide (✓ : au moins 3 doses reçues quel que soit le vaccin ou 2 doses avec un intervalle de 6 mois, avec une tolérance de 2 semaines soit 165 jours, si vaccin Engerix B 20 ou Genhevac B = schéma rapide) ;
- enfin, afficher pour chaque groupe de maladies une synthèse (✓ : si au moins un tag d’autorisation parentale est présent pour la maladie ou le groupe de maladies, mais que le schéma n’est pas valide — donc marqué comme « À faire »). Les 5 dernières colonnes récapitules donc si un vaccin autorisé par les parents est à faire ou non pour le collégien.
- cette requête permet de cibler aucun, un ou plusieurs départements en fonction des paramètres passés. Elle fonctionne pour les départements de métropole comme pour les DOM.
Utilisation de la requête
- Sélection des patients : oui. Sélectionnez ici le tag "Campagne HPV 24/25 ou 25/26" afin de limiter la liste aux collégiens concernés par la campagne.
Vous pouvez également sélectionner le tag correspondant au code UA d’un établissement afin de restreindre l’extraction aux seuls élèves de cet établissement. Dans le cas contraire, tous les élèves de tous les établissements rattachés à votre centre de vaccination seront sélectionnés. - Récupération des carnets : oui
- Récupération des diagnostics : non
Par défaut, les collèges de tous les départements sont sélectionnés.
Vous pouvez toutefois limiter l'affichage des collèges à certains départements. Pour cela, Ligne 3, remplacer :
ARRAY[ ]
par (exemple)ARRAY['33','40','47'] Seuls les collèges de ces départements seront affichés.
Il est aussi possible de modifier les autres paramètres d'intervalle par défaut (normalement non nécessaire).
Requête à coller dans l'éditeur :
WITH params AS (
SELECT
ARRAY[ ]::TEXT[] AS departements,
5 AS intervalle_min_mois, -- Intervalle minimal entre 2 doses de Gardasil 9
126 AS age_min_acwy_mois, -- ACWY : 11 ans moins 6 mois de tolérance
126 AS age_min_dtp_mois, -- DTP : 11 ans moins 6 mois de tolérance
165 AS intervalle_min_hepb_jours, -- Hépatite B : intervalle minimal (5,5 mois = 165 jours)
12 AS age_min_ror_2d_mois, -- ROR : 2 doses si D1 ≥ 12 mois
6 AS age_min_ror_3d_mois, -- ROR : 3 doses si D1 ≥ 6 mois
-- Ne pas modifier à priori ------------------------------------
ARRAY['6e','5e','4e','3e','nonconcerné']::TEXT[] AS classes,
'collège%' AS motif_college_1,
'college%' AS motif_college_2
),
/* =========================
Gardasil 9
========================= */
gardasil_par_patient AS (
SELECT
v.patient_id,
COUNT(*) AS nbre_doses_gardasil9,
MIN(v.performed_on) AS d1_gardasil,
MAX(v.performed_on) AS date_derniere_dose_gardasil,
MAX(v.performed_on) FILTER (
WHERE v.performed_on < (
SELECT MAX(v2.performed_on)
FROM vaccinations v2
WHERE v2.patient_id = v.patient_id
AND v2.vaccine_id = 'a462bc91-c834-482c-b3ed-81f20eeabb64' -- Gardasil 9
)
) AS date_avant_derniere_dose_gardasil
FROM vaccinations v
WHERE v.vaccine_id = 'a462bc91-c834-482c-b3ed-81f20eeabb64' -- Gardasil 9
GROUP BY v.patient_id
),
/* =========================
Méningocoque ACWY
========================= */
acwy_par_patient AS (
SELECT
v.patient_id,
MAX(v.performed_on) AS date_derniere_dose_acwy
FROM vaccinations v
WHERE v.vaccine_id IN (
'54754014-a3fc-42bb-b007-1a2024eca164', -- Nimenrix
'1715218e-371a-4ad2-a9d9-bb671d6c413c', -- Menveo
'38fef5bc-4f68-4292-aa82-c45042ab4af4' -- MenQuadfi
)
GROUP BY v.patient_id
),
/* =========================
DTP
========================= */
dtp_par_patient AS (
SELECT
v.patient_id,
MAX(v.performed_on) AS date_derniere_dose_dtp
FROM vaccinations v
WHERE v.vaccine_id IN (
'c7d9d700-b481-4072-ab16-3b1aa7376298', -- Infanrix Tetra
'384198db-b13c-4e08-b7a1-9311809a21b9', -- Boostrix Tetra
'3ac78420-22e7-4ef4-90de-979a17726312', -- Tetravac Acellulaire
'55adc664-d4a2-4154-80b2-dabd139fed28' -- Repevax
)
GROUP BY v.patient_id
),
/* =========================
ROR
========================= */
ror_par_patient AS (
SELECT
v.patient_id,
COUNT(*) AS nbre_doses_ror,
MIN(v.performed_on) AS date_premiere_dose_ror,
MAX(v.performed_on) AS date_derniere_dose_ror
FROM vaccinations v
WHERE v.vaccine_id IN (
'9435556b-4fce-44f7-81d6-e5d2d240860b', -- Priorix
'9a08067b-3ec7-4229-a6f6-0803049ee699' -- MMR-VaxPro
)
GROUP BY v.patient_id
),
/* =========================
Hépatite B
========================= */
hepb_par_patient AS (
SELECT
v.patient_id,
-- Nombre total de doses Hépatite B (tous vaccins)
COUNT(*) AS nbre_doses_hepb,
-- Nombre de doses GENHEVAC B ou ENGERIX B20
COUNT(*) FILTER (
WHERE v.vaccine_id IN (
'73e38d58-5cf8-4c61-9575-2771fbce2b8b', -- Engerix B20
'77fab95c-0953-448a-b284-cd71b7a1583d' -- Genhevac B
)
) AS nbre_doses_hepb_20,
-- Dernière dose Hépatite B (tous vaccins)
MAX(v.performed_on) AS date_derniere_dose_hepb,
-- Dernière dose GENHEVAC B / ENGERIX B20
MAX(v.performed_on) FILTER (
WHERE v.vaccine_id IN (
'73e38d58-5cf8-4c61-9575-2771fbce2b8b', -- Engerix B20
'77fab95c-0953-448a-b284-cd71b7a1583d' -- Genhevac B
)
) AS date_derniere_dose_hepb_20,
-- Dose GENHEVAC B / ENGERIX B20 précédant la dernière
MAX(v.performed_on) FILTER (
WHERE v.vaccine_id IN (
'73e38d58-5cf8-4c61-9575-2771fbce2b8b', -- Engerix B20
'77fab95c-0953-448a-b284-cd71b7a1583d' -- Genhevac B
)
AND v.performed_on < (
SELECT MAX(v2.performed_on)
FROM vaccinations v2
WHERE v2.patient_id = v.patient_id
AND v2.vaccine_id IN (
'73e38d58-5cf8-4c61-9575-2771fbce2b8b', -- Engerix B20
'77fab95c-0953-448a-b284-cd71b7a1583d' -- Genhevac B
)
)
) AS date_avant_derniere_dose_hepb_20
FROM vaccinations v
WHERE v.vaccine_id IN (
'3a350807-4143-4687-9ec7-2811d1a996c8', -- Engerix B10
'73e38d58-5cf8-4c61-9575-2771fbce2b8b', -- Engerix B20
'04c8f3b5-67f5-43c1-9d9a-57792f8a6beb', -- HBVAXPRO 5 µg
'304dca1e-358a-4721-a840-604320ea3587', -- HBVAXPRO 10 µg
'3f59b5bb-ef04-4815-9ed5-87dacef76765', -- HBVAXPRO 40 µg
'3ddb5821-9a52-428e-a40d-d065e4a630b1', -- HEXYON
'b9562145-be50-420f-a809-dd0e2762d142', -- VAXELIS
'77fab95c-0953-448a-b284-cd71b7a1583d', -- GENHEVAC B
'246a6067-7c45-42af-bff9-90832bb6e4aa' -- Infanrix Hexa
)
GROUP BY v.patient_id
),
patients_enrichis AS (
SELECT
p.id,
p.last_name AS Nom,
p.first_names AS Prénom,
p.gender AS Sexe,
p.birth_date AS "Date de naissance",
p.created_at AS "Création du dossier",
p.tags,
g.nbre_doses_gardasil9,
g.date_derniere_dose_gardasil,
g.date_avant_derniere_dose_gardasil,
a.date_derniere_dose_acwy,
d.date_derniere_dose_dtp,
r.nbre_doses_ror,
r.date_premiere_dose_ror,
r.date_derniere_dose_ror,
h.nbre_doses_hepb,
h.nbre_doses_hepb_20,
h.date_derniere_dose_hepb,
h.date_derniere_dose_hepb_20,
h.date_avant_derniere_dose_hepb_20,
params.intervalle_min_mois,
params.intervalle_min_hepb_jours,
params.age_min_acwy_mois,
params.age_min_dtp_mois,
params.age_min_ror_2d_mois,
params.age_min_ror_3d_mois,
-- UAI
(
SELECT x.tag
FROM UNNEST(p.tags) AS x(tag)
WHERE
(
-- Métropole : 001 à 095
TRY_CAST(substring(x.tag FROM 1 FOR 3) AS INTEGER) BETWEEN 1 AND 95
OR
-- DOM : 971 à 978
TRY_CAST(substring(x.tag FROM 1 FOR 3) AS INTEGER) BETWEEN 971 AND 978
)
ORDER BY x.tag
LIMIT 1
) AS uai,
-- Collège
(
SELECT x.tag
FROM UNNEST(p.tags) AS x(tag)
WHERE x.tag ILIKE params.motif_college_1
OR x.tag ILIKE params.motif_college_2
ORDER BY x.tag
LIMIT 1
) AS college,
-- Classe
(
SELECT x.tag
FROM UNNEST(p.tags) AS x(tag)
WHERE x.tag = ANY(params.classes)
LIMIT 1
) AS classe
FROM patients p
CROSS JOIN params
LEFT JOIN gardasil_par_patient g ON g.patient_id = p.id
LEFT JOIN acwy_par_patient a ON a.patient_id = p.id
LEFT JOIN dtp_par_patient d ON d.patient_id = p.id
LEFT JOIN ror_par_patient r ON r.patient_id = p.id
LEFT JOIN hepb_par_patient h ON h.patient_id = p.id
WHERE
-- Si aucun département n'est fourni, aucun filtre n'est appliqué
array_length(params.departements) = 0
OR
-- Sinon, filtrage sur les départements fournis
EXISTS (
SELECT 1
FROM UNNEST(p.tags) t(tag)
WHERE EXISTS (
SELECT 1
FROM UNNEST(params.departements) d(dep)
WHERE
(
-- Métropole : départements à 2 chiffres → préfixe 0
length(d.dep) = 2
AND t.tag LIKE '0' || d.dep || '%'
)
OR
(
-- DOM : départements à 3 chiffres → pas de préfixe
length(d.dep) = 3
AND t.tag LIKE d.dep || '%'
)
)
)
)
SELECT
uai AS "Code UAI",
college AS "Collège",
classe AS "Classe",
Nom,
Prénom,
Sexe,
"Date de naissance",
CAST(date_diff('month', "Date de naissance", current_date) / 12 AS INTEGER)
|| ' ans ' ||
CAST(date_diff('month', "Date de naissance", current_date) % 12 AS INTEGER)
|| ' mois' AS "Âge ce jour",
"Création du dossier",
/* ===== TAGS CAMPAGNES ===== */
CASE WHEN list_contains(tags, 'hpv2526') THEN '✓' ELSE '-' END AS hpv2526,
CASE WHEN list_contains(tags, 'hpv2425') THEN '✓' ELSE '-' END AS hpv2425,
CASE WHEN list_contains(tags, 'men2526') THEN '✓' ELSE '-' END AS men2526,
CASE WHEN list_contains(tags, 'men2425') THEN '✓' ELSE '-' END AS men2425,
CASE WHEN list_contains(tags, 'ror2526') THEN '✓' ELSE '-' END AS ror2526,
CASE WHEN list_contains(tags, 'ror2425') THEN '✓' ELSE '-' END AS ror2425,
CASE WHEN list_contains(tags, 'hepb2526') THEN '✓' ELSE '-' END AS hepb2526,
CASE WHEN list_contains(tags, 'hepb2425') THEN '✓' ELSE '-' END AS hepb2425,
CASE WHEN list_contains(tags, 'dtcp2526') THEN '✓' ELSE '-' END AS dtcp2526,
CASE WHEN list_contains(tags, 'dtcp2425') THEN '✓' ELSE '-' END AS dtcp2425,
/* ===== Gardasil 9 ===== */
nbre_doses_gardasil9 AS "Nb doses HPV",
date_derniere_dose_gardasil AS "Dernière dose HPV",
CASE
WHEN nbre_doses_gardasil9 >= 2
AND date_avant_derniere_dose_gardasil IS NOT NULL
AND date_diff('month', date_avant_derniere_dose_gardasil, date_derniere_dose_gardasil) >= intervalle_min_mois
THEN '✓'
ELSE '-'
END AS "Schéma valide HPV",
/* ===== ACWY ===== */
date_derniere_dose_acwy AS "Dernière dose ACWY",
CASE
WHEN date_derniere_dose_acwy IS NOT NULL
THEN
CAST(date_diff('month', "Date de naissance", date_derniere_dose_acwy) / 12 AS INTEGER)
|| ' ans ' ||
CAST(date_diff('month', "Date de naissance", date_derniere_dose_acwy) % 12 AS INTEGER)
|| ' mois'
ELSE NULL
END AS "Âge lors dernière dose ACWY",
CASE
WHEN date_derniere_dose_acwy IS NOT NULL
AND date_diff('month', "Date de naissance", date_derniere_dose_acwy) >= age_min_acwy_mois
THEN '✓'
ELSE '-'
END AS "Schéma valide ACWY",
/* ===== DTCP ===== */
date_derniere_dose_dtp AS "Dernière dose DTCP",
CASE
WHEN date_derniere_dose_dtp IS NOT NULL
THEN
CAST(date_diff('month', "Date de naissance", date_derniere_dose_dtp) / 12 AS INTEGER)
|| ' ans ' ||
CAST(date_diff('month', "Date de naissance", date_derniere_dose_dtp) % 12 AS INTEGER)
|| ' mois'
ELSE NULL
END AS "Âge lors dernière dose DTCP",
CASE
WHEN date_derniere_dose_dtp IS NOT NULL
AND date_diff('month', "Date de naissance", date_derniere_dose_dtp) >= age_min_dtp_mois
THEN '✓'
ELSE '-'
END AS "Schéma valide DTCP",
/* ===== ROR ===== */
nbre_doses_ror AS "Nb doses ROR",
date_derniere_dose_ror AS "Dernière dose ROR",
CASE
WHEN nbre_doses_ror >= 2
AND date_diff('month', "Date de naissance", date_premiere_dose_ror) >= age_min_ror_2d_mois
THEN '✓'
WHEN nbre_doses_ror >= 3
AND date_diff('month', "Date de naissance", date_premiere_dose_ror) >= age_min_ror_3d_mois
THEN '✓'
ELSE '-'
END AS "Schéma valide ROR",
/* ===== Hépatite B ===== */
CASE
WHEN
-- ≥ 3 doses, tous vaccins
nbre_doses_hepb >= 3
OR
-- 2 doses GENHEVAC B / ENGERIX B20 avec ≥ 5,5 mois
(
nbre_doses_hepb = 2
AND nbre_doses_hepb_20 = 2
AND date_avant_derniere_dose_hepb_20 IS NOT NULL
AND date_diff(
'day',
date_avant_derniere_dose_hepb_20,
date_derniere_dose_hepb_20
) >= intervalle_min_hepb_jours
)
THEN '✓'
ELSE '-'
END AS "Schéma valide Hép B",
CASE
WHEN
(
list_contains(tags, 'hpv2425')
OR list_contains(tags, 'hpv2526')
)
AND NOT (
nbre_doses_gardasil9 >= 2
AND date_avant_derniere_dose_gardasil IS NOT NULL
AND date_diff(
'month',
date_avant_derniere_dose_gardasil,
date_derniere_dose_gardasil
) >= intervalle_min_mois
)
THEN '✓'
ELSE '-'
END AS "HPV à faire",
CASE
WHEN
(
list_contains(tags, 'men2425')
OR list_contains(tags, 'men2526')
)
AND NOT (
date_derniere_dose_acwy IS NOT NULL
AND date_diff(
'month',
"Date de naissance",
date_derniere_dose_acwy
) >= age_min_acwy_mois
)
THEN '✓'
ELSE '-'
END AS "ACWY à faire",
CASE
WHEN
(
list_contains(tags, 'ror2425')
OR list_contains(tags, 'ror2526')
)
AND (
nbre_doses_ror IS NULL
OR nbre_doses_ror = 0
OR (
nbre_doses_ror = 1
)
OR (
nbre_doses_ror = 2
AND date_diff(
'month',
"Date de naissance",
date_premiere_dose_ror
) < age_min_ror_2d_mois
)
OR (
nbre_doses_ror >= 3
AND date_diff(
'month',
"Date de naissance",
date_premiere_dose_ror
) < age_min_ror_3d_mois
)
)
THEN '✓'
ELSE '-'
END AS "ROR à faire",
CASE
WHEN
(
list_contains(tags, 'dtcp2425')
OR list_contains(tags, 'dtcp2526')
)
AND NOT (
date_derniere_dose_dtp IS NOT NULL
AND date_diff(
'month',
"Date de naissance",
date_derniere_dose_dtp
) >= age_min_dtp_mois
)
THEN '✓'
ELSE '-'
END AS "DTCP à faire",
CASE
WHEN
(
list_contains(tags, 'hepb2425')
OR list_contains(tags, 'hepb2526')
)
AND NOT (
nbre_doses_hepb >= 3
OR (
nbre_doses_hepb = 2
AND nbre_doses_hepb_20 = 2
AND date_avant_derniere_dose_hepb_20 IS NOT NULL
AND date_diff(
'day',
date_avant_derniere_dose_hepb_20,
date_derniere_dose_hepb_20
) >= intervalle_min_hepb_jours
)
)
THEN '✓'
ELSE '-'
END AS "Hép B à faire"
FROM patients_enrichis
WHERE NOT list_contains(tags, 'exclusion')
ORDER BY
uai,
classe,
Nom,
Prénom;Liste des collèges avec pour chaque collège le nombre d'élèves concernés et le nombre de doses à prévoir
Le but : produire une liste des établissements, classés par code UAI, avec, pour chaque établissement, le nombre total d'élèves à convoquer (ayant au moins un vaccin à faire et une autorisation parentale correspondante, donné par la requête ci-dessus) et, pour chaque maladie, le nombre de doses à prévoir (calculé à partir de la colonne « à faire » de chaque maladie dans la requête ci-dessus).
Utilisation de la requête
- Sélection des patients : oui. Sélectionnez ici le tag "Campagne HPV 24/25 ou 25/26" afin de limiter la liste aux collégiens concernés par la campagne.
Vous pouvez également sélectionner le tag correspondant au code UA d’un établissement afin de restreindre l’extraction aux seuls élèves de cet établissement. Dans le cas contraire, tous les élèves de tous les établissements rattachés à votre centre de vaccination seront sélectionnés. - Récupération des carnets : oui
- Récupération des diagnostics : non
Par défaut, les collèges de tous les départements sont sélectionnés.
Vous pouvez toutefois limiter l'affichage des collèges à certains départements. Pour cela, Ligne 3, remplacer :
ARRAY[ ]
par (exemple)ARRAY['33','40','47'] Seuls les collèges de ces départements seront affichés.
Il est aussi possible de modifier les autres paramètres d'intervalle par défaut (normalement non nécessaire).
Requête à coller dans l'éditeur :
WITH params AS (
SELECT
ARRAY[]::TEXT[] AS departements,
5 AS intervalle_min_mois,
126 AS age_min_acwy_mois,
126 AS age_min_dtp_mois,
165 AS intervalle_min_hepb_jours,
12 AS age_min_ror_2d_mois,
6 AS age_min_ror_3d_mois,
ARRAY['6e','5e','4e','3e','nonconcerné']::TEXT[] AS classes,
'collège%' AS motif_college_1,
'college%' AS motif_college_2
),
/* =========================
GARDASIL 9
========================= */
gardasil_par_patient AS (
SELECT
v.patient_id,
COUNT(*) AS nbre_doses_gardasil9,
MAX(v.performed_on) AS date_derniere_dose_gardasil,
MAX(v.performed_on) FILTER (
WHERE v.performed_on < (
SELECT MAX(v2.performed_on)
FROM vaccinations v2
WHERE v2.patient_id = v.patient_id
AND v2.vaccine_id = 'a462bc91-c834-482c-b3ed-81f20eeabb64'
)
) AS date_avant_derniere_dose_gardasil
FROM vaccinations v
WHERE v.vaccine_id = 'a462bc91-c834-482c-b3ed-81f20eeabb64'
GROUP BY v.patient_id
),
/* =========================
ACWY
========================= */
acwy_par_patient AS (
SELECT
v.patient_id,
MAX(v.performed_on) AS date_derniere_dose_acwy
FROM vaccinations v
WHERE v.vaccine_id IN (
'54754014-a3fc-42bb-b007-1a2024eca164',
'1715218e-371a-4ad2-a9d9-bb671d6c413c',
'38fef5bc-4f68-4292-aa82-c45042ab4af4'
)
GROUP BY v.patient_id
),
/* =========================
DTCP
========================= */
dtp_par_patient AS (
SELECT
v.patient_id,
MAX(v.performed_on) AS date_derniere_dose_dtp
FROM vaccinations v
WHERE v.vaccine_id IN (
'c7d9d700-b481-4072-ab16-3b1aa7376298',
'384198db-b13c-4e08-b7a1-9311809a21b9',
'3ac78420-22e7-4ef4-90de-979a17726312',
'55adc664-d4a2-4154-80b2-dabd139fed28'
)
GROUP BY v.patient_id
),
/* =========================
ROR
========================= */
ror_par_patient AS (
SELECT
v.patient_id,
COUNT(*) AS nbre_doses_ror,
MIN(v.performed_on) AS date_premiere_dose_ror,
MAX(v.performed_on) AS date_derniere_dose_ror
FROM vaccinations v
WHERE v.vaccine_id IN (
'9435556b-4fce-44f7-81d6-e5d2d240860b',
'9a08067b-3ec7-4229-a6f6-0803049ee699'
)
GROUP BY v.patient_id
),
/* =========================
HÉPATITE B
========================= */
hepb_par_patient AS (
SELECT
v.patient_id,
COUNT(*) AS nbre_doses_hepb,
COUNT(*) FILTER (
WHERE v.vaccine_id IN (
'73e38d58-5cf8-4c61-9575-2771fbce2b8b',
'77fab95c-0953-448a-b284-cd71b7a1583d'
)
) AS nbre_doses_hepb_20,
MAX(v.performed_on) AS date_derniere_dose_hepb,
MAX(v.performed_on) FILTER (
WHERE v.vaccine_id IN (
'73e38d58-5cf8-4c61-9575-2771fbce2b8b',
'77fab95c-0953-448a-b284-cd71b7a1583d'
)
) AS date_derniere_dose_hepb_20,
MAX(v.performed_on) FILTER (
WHERE v.vaccine_id IN (
'73e38d58-5cf8-4c61-9575-2771fbce2b8b',
'77fab95c-0953-448a-b284-cd71b7a1583d'
)
AND v.performed_on < (
SELECT MAX(v2.performed_on)
FROM vaccinations v2
WHERE v2.patient_id = v.patient_id
AND v2.vaccine_id IN (
'73e38d58-5cf8-4c61-9575-2771fbce2b8b',
'77fab95c-0953-448a-b284-cd71b7a1583d'
)
)
) AS date_avant_derniere_dose_hepb_20
FROM vaccinations v
WHERE v.vaccine_id IN (
'3a350807-4143-4687-9ec7-2811d1a996c8',
'73e38d58-5cf8-4c61-9575-2771fbce2b8b',
'04c8f3b5-67f5-43c1-9d9a-57792f8a6beb',
'304dca1e-358a-4721-a840-604320ea3587',
'3f59b5bb-ef04-4815-9ed5-87dacef76765',
'3ddb5821-9a52-428e-a40d-d065e4a630b1',
'b9562145-be50-420f-a809-dd0e2762d142',
'77fab95c-0953-448a-b284-cd71b7a1583d',
'246a6067-7c45-42af-bff9-90832bb6e4aa'
)
GROUP BY v.patient_id
),
/* =========================
PATIENTS ENRICHIS
========================= */
patients_enrichis AS (
SELECT
p.id,
p.birth_date AS "Date de naissance",
p.tags,
/* ===== UAI ===== */
(
SELECT x.tag
FROM UNNEST(p.tags) AS x(tag)
WHERE
TRY_CAST(substring(x.tag FROM 1 FOR 3) AS INTEGER) BETWEEN 1 AND 978
ORDER BY x.tag
LIMIT 1
) AS uai,
g.*,
a.date_derniere_dose_acwy,
d.date_derniere_dose_dtp,
r.*,
h.*,
params.*
FROM patients p
CROSS JOIN params
LEFT JOIN gardasil_par_patient g ON g.patient_id = p.id
LEFT JOIN acwy_par_patient a ON a.patient_id = p.id
LEFT JOIN dtp_par_patient d ON d.patient_id = p.id
LEFT JOIN ror_par_patient r ON r.patient_id = p.id
LEFT JOIN hepb_par_patient h ON h.patient_id = p.id
),
/* =========================
BASE FINALE : LOGIQUE INITIALE
========================= */
base AS (
SELECT
uai,
tags,
/* ===== HPV à faire ===== */
CASE
WHEN
(list_contains(tags, 'hpv2425') OR list_contains(tags, 'hpv2526'))
AND NOT (
nbre_doses_gardasil9 >= 2
AND date_avant_derniere_dose_gardasil IS NOT NULL
AND date_diff(
'month',
date_avant_derniere_dose_gardasil,
date_derniere_dose_gardasil
) >= intervalle_min_mois
)
THEN '✓' ELSE '-' END AS "HPV à faire",
/* ===== ACWY à faire ===== */
CASE
WHEN
(list_contains(tags, 'men2425') OR list_contains(tags, 'men2526'))
AND NOT (
date_derniere_dose_acwy IS NOT NULL
AND date_diff(
'month',
"Date de naissance",
date_derniere_dose_acwy
) >= age_min_acwy_mois
)
THEN '✓' ELSE '-' END AS "ACWY à faire",
/* ===== ROR à faire ===== */
CASE
WHEN
(list_contains(tags, 'ror2425') OR list_contains(tags, 'ror2526'))
AND (
nbre_doses_ror IS NULL
OR nbre_doses_ror = 0
OR nbre_doses_ror = 1
OR (
nbre_doses_ror = 2
AND date_diff(
'month',
"Date de naissance",
date_premiere_dose_ror
) < age_min_ror_2d_mois
)
OR (
nbre_doses_ror >= 3
AND date_diff(
'month',
"Date de naissance",
date_premiere_dose_ror
) < age_min_ror_3d_mois
)
)
THEN '✓' ELSE '-' END AS "ROR à faire",
/* ===== DTCP à faire ===== */
CASE
WHEN
(list_contains(tags, 'dtcp2425') OR list_contains(tags, 'dtcp2526'))
AND NOT (
date_derniere_dose_dtp IS NOT NULL
AND date_diff(
'month',
"Date de naissance",
date_derniere_dose_dtp
) >= age_min_dtp_mois
)
THEN '✓' ELSE '-' END AS "DTCP à faire",
/* ===== HÉPATITE B à faire ===== */
CASE
WHEN
(list_contains(tags, 'hepb2425') OR list_contains(tags, 'hepb2526'))
AND NOT (
nbre_doses_hepb >= 3
OR (
nbre_doses_hepb = 2
AND nbre_doses_hepb_20 = 2
AND date_avant_derniere_dose_hepb_20 IS NOT NULL
AND date_diff(
'day',
date_avant_derniere_dose_hepb_20,
date_derniere_dose_hepb_20
) >= intervalle_min_hepb_jours
)
)
THEN '✓' ELSE '-' END AS "Hép B à faire"
FROM patients_enrichis
WHERE NOT list_contains(tags, 'exclusion')
)
/* =========================
SYNTHÈSE PAR UAI
========================= */
SELECT
uai AS "Code UAI",
COUNT(*) AS "Nombre d'élèves",
SUM(CASE WHEN "HPV à faire" = '✓' THEN 1 ELSE 0 END) AS "Doses HPV à prévoir",
SUM(CASE WHEN "ACWY à faire" = '✓' THEN 1 ELSE 0 END) AS "Doses ACWY à prévoir",
SUM(CASE WHEN "ROR à faire" = '✓' THEN 1 ELSE 0 END) AS "Doses ROR à prévoir",
SUM(CASE WHEN "DTCP à faire" = '✓' THEN 1 ELSE 0 END) AS "Doses DTCP à prévoir",
SUM(CASE WHEN "Hép B à faire" = '✓' THEN 1 ELSE 0 END) AS "Doses Hépatite B à prévoir"
FROM base
GROUP BY uai
ORDER BY uai;
Liste des dossiers créés depuis le 01/01/2025 avec tag « hpv2425 »
- Sélection des patients : oui
- Récupération des carnets : non
- Récupération des diagnostics : non
NB : la date de début d'inclusion peut facilement être modifiée (ici 2025-01-01) ainsi que le tag (ici hpv2425). Les dates doivent obligatoirement être au format AAAA-MM-JJ.
Requête à coller dans l'éditeur :
WITH params AS (
SELECT
DATE '2025-01-01' AS date_creation_min, -- Date minimale (incluse) de création patient
ARRAY['hpv2425']::TEXT[] AS tags_recherches -- Tags à rechercher
)
SELECT DISTINCT
p.last_name AS "Nom",
p.first_names AS "Prénoms",
p.birth_date AS "Date de naissance",
p.social_security_number AS "N° de sécurité sociale",
p.gender AS "Sexe",
p.created_at AS "Créé le",
p.tags AS "Tags"
FROM patients p
CROSS JOIN params par
WHERE
p.created_at >= par.date_creation_min
AND p.tags && par.tags_recherches;Exemple de résultat :
Liste des patientes ayant reçu les 2 premières doses de GARDASIL 9 avec moins de 5 mois d'écart (schéma invalide)
- Sélection des patients : oui
- Récupération des carnets : oui
- Récupération des diagnostics : non
Requête à coller dans l'éditeur :
WITH ranked_doses AS (
SELECT
p.id,
p.first_names AS "Prénom",
p.last_name AS "Nom",
p.gender AS "Sexe",
p.birth_date AS "Date de naissance",
v.performed_on,
ROW_NUMBER() OVER (
PARTITION BY p.id
ORDER BY v.performed_on ASC, v.id ASC
) AS dose_rank
FROM patients p
JOIN vaccinations v
ON v.patient_id = p.id
WHERE
p.gender = 'F'
AND v.vaccine_id = 'a462bc91-c834-482c-b3ed-81f20eeabb64'
)
SELECT
id,
"Nom",
"Prénom",
"Sexe",
"Date de naissance",
MAX(CASE WHEN dose_rank = 1 THEN performed_on END) AS "Date dose 1",
MAX(CASE WHEN dose_rank = 2 THEN performed_on END) AS "Date dose 2",
(
DATE_PART(
'year',
AGE(
MAX(CASE WHEN dose_rank = 2 THEN performed_on END),
MAX(CASE WHEN dose_rank = 1 THEN performed_on END)
)
) * 12
+
DATE_PART(
'month',
AGE(
MAX(CASE WHEN dose_rank = 2 THEN performed_on END),
MAX(CASE WHEN dose_rank = 1 THEN performed_on END)
)
)
) AS "Intervalle entre les 2 doses (mois)"
FROM ranked_doses
GROUP BY
id,
"Nom",
"Prénom",
"Sexe",
"Date de naissance"
HAVING
COUNT(*) >= 2
AND
MAX(CASE WHEN dose_rank = 2 THEN performed_on END)
< MAX(CASE WHEN dose_rank = 1 THEN performed_on END) + INTERVAL '5 months'
ORDER BY
"Nom",
"Prénom";Exemple de résultat :
Liste des patients, tous sexes confondus, ayant reçu au moins une dose de GARDASIL 9, avec indication de la conformité du schéma vaccinal
- Sélection des patients : oui
- Récupération des carnets : oui
- Récupération des diagnostics : non
La requête affiche le résultat de la conformité dans la colonne de droite, suivant l'algorithme :
- moins de 5 mois entre d1d2 = non conforme
- à partir de 5 mois = conforme
- pas de d2 = non évalué
Requête à coller dans l'éditeur :
WITH ranked_doses AS (
SELECT
p.id,
p.first_names,
p.last_name,
p.gender,
p.birth_date,
v.vaccine_id,
v.performed_on,
ROW_NUMBER() OVER (
PARTITION BY p.id, v.vaccine_id
ORDER BY v.performed_on
) AS dose_rank
FROM patients p
JOIN vaccinations v
ON v.patient_id = p.id
WHERE
v.vaccine_id = 'a462bc91-c834-482c-b3ed-81f20eeabb64'
),
first_two_doses AS (
SELECT
id,
first_names,
last_name,
gender,
birth_date,
MAX(CASE WHEN dose_rank = 1 THEN performed_on END) AS date_dose_1,
MAX(CASE WHEN dose_rank = 2 THEN performed_on END) AS date_dose_2
FROM ranked_doses
WHERE dose_rank IN (1, 2)
GROUP BY
id, first_names, last_name, gender, birth_date
)
SELECT
id,
first_names,
last_name,
gender,
birth_date,
date_dose_1 AS d1,
date_dose_2 AS d2,
date_diff('month', date_dose_1, date_dose_2) AS interval_mois,
CASE
WHEN date_dose_2 IS NULL THEN 'NON ÉVALUABLE'
WHEN date_diff('month', date_dose_1, date_dose_2) < 5 THEN 'NON CONFORME'
ELSE 'CONFORME'
END AS indicateur_non_conformite
FROM first_two_doses
ORDER BY last_name, first_names;Exemple de résultat :