Le modèle OMOP CDM organise les données de santé autour de tables standardisées. Pour explorer la structure complète, consultez le schéma OMOP v5.4.
Ctrl/Cmd + Entrée : Exécuter
Ctrl/Cmd + Shift + Entrée : Exécuter et valider
1PERSON
2VISIT_OCCURRENCE
3VISIT_DETAIL
4DEATH
5OBSERVATION_PERIOD
6CONCEPT
7SYNTHÈSE
Année 2135. Vous êtes data scientist spécialisé en données massives de santé, et référent OMOP de votre hôpital. Toutes les données des patients sont désormais informatisées et stockées dans des bases fédérées au format OMOP CDM, le standard international qui a unifié les systèmes de santé du monde entier.
Ce matin, une demande urgente arrive sur votre terminal : retrouver le dossier d'un patient. Seule information disponible : le patient est né en 2054.
À vous de jouer.
La table PERSON contient les informations démographiques de chaque patient. C’est le point de départ pour retrouver notre patient né en 2054.
1Exercice 1.1 : Explorer la table PERSON
Commencez par explorer la structure de la table person. Affichez les 5 premières lignes pour découvrir les colonnes disponibles.
Exercice 1.1
Utilisez SELECT * FROM ... LIMIT 5
2Exercice 1.2 : Compter les patients
Combien de patients sont enregistrés dans la base de votre hôpital ? Cela vous donnera une idée de l’ampleur de la recherche.
Exercice 1.2
Utilisez COUNT(*)
3Exercice 1.3 : Trouver le patient
Vous savez que le patient recherché est né en 2054. Trouvez son person_id en filtrant sur l’année de naissance (year_of_birth).
Exercice 1.3
Filtrez avec WHERE sur l'année de naissance
Patient identifié : 8789342.
Pour comprendre son parcours médical, vous devez maintenant explorer son historique d'hospitalisations.
Quand a-t-il été hospitalisé ? Combien de fois ? Et quelle a été la durée de chaque séjour ?
La table VISIT_OCCURRENCE enregistre chaque hospitalisation d’un patient. Une hospitalisation peut contenir plusieurs séjours hospitaliers (dans la table visit_detail).
1Exercice 2.1 : Explorer les hospitalisations
Affichez les 5 premières hospitalisations de la table visit_occurrence.
Exercice 2.1
Utilisez SELECT * FROM ... LIMIT 5
2Exercice 2.2 : Compter les hospitalisations
Combien y a-t-il d’hospitalisations au total dans la base ?
Exercice 2.2
Utilisez COUNT(*)
3Exercice 2.3 : Hospitalisations par patient
Combien d’hospitalisations a effectué notre patient (person_id = 8789342) ?
Exercice 2.3
Filtrez avec WHERE sur person_id
4Exercice 2.4 : Durée des hospitalisations
Calculez la durée en jours de chaque hospitalisation de notre patient, triées par date de début. Affichez l’identifiant de l’hospitalisation, les dates de début et fin, et créez une colonne duree_hospit pour la durée calculée.
Exercice 2.4
Calculez la différence entre date de fin et date de début
Hospitalisation identifiée : 6687131 (25 jours).
Cette hospitalisation a duré 25 jours. Que s'est-il passé pendant ce séjour ? Dans quels services le patient est-il passé ?
La table VISIT_DETAIL contient les détails granulaires d’une hospitalisation : passages aux urgences, transferts entre unités, séjours dans différentes unités hospitalières…
1Exercice 3.1 : Explorer les détails
Affichez les 5 premières lignes de la table visit_detail pour découvrir sa structure.
Exercice 3.1
Utilisez SELECT * FROM ... LIMIT 5
2Exercice 3.2 : Détails de l'hospitalisation
Combien de séjours hospitaliers (lignes dans visit_detail) sont liés à l’hospitalisation visit_occurrence_id = 6687131 ?
Exercice 3.2
Utilisez COUNT(*) et filtrez sur visit_occurrence_id
3Exercice 3.3 : Parcours du patient
Affichez tous les séjours de cette hospitalisation, triés par date de début. Sélectionnez visit_detail_id, visit_detail_start_date, visit_detail_end_date et care_site_id.
Exercice 3.3
Filtrez sur l'hospitalisation et triez par date de début de séjour
4Exercice 3.4 : Durée des séjours
Calculez la durée de chaque séjour pour cette hospitalisation. Ajoutez une colonne duree_sejour (en jours) à la requête précédente.
Exercice 3.4
Calculez la différence entre date de fin et date de début du séjour
5Exercice 3.5 : Nom des unités
En repartant de la requête précédente, récupérez le nom des unités (care_site_name) en joignant visit_detail avec la table care_site.
Exercice 3.5
Faites une jointure avec care_site pour obtenir le nom de l'unité
Intéressons-nous maintenant aux décès.
La table DEATH enregistre les décès des patients. Elle contient une ligne par patient décédé, avec la date et éventuellement la cause du décès. Explorons cette table pour comprendre la mortalité dans notre cohorte, et regardons si le patient que l'on suit est décédé.
1Exercice 4.1 : Explorer la structure de DEATH
Affichez toutes les colonnes de la table death pour découvrir sa structure.
Exercice 4.1
Utilisez SELECT * FROM ...
2Exercice 4.2 : Compter les décès
Combien de patients sont décédés dans cette base ?
Exercice 4.2
Utilisez COUNT(*)
3Exercice 4.3 : Notre patient est-il décédé ?
Vérifiez si notre patient 8789342 est décédé en faisant une jointure LEFT JOIN entre person et death. Affichez le person_id et la death_date (qui sera NULL si le patient est vivant).
Exercice 4.3
Faites une jointure entre person et death sur person_id
Notre patient 8789342 est vivant.
La table OBSERVATION_PERIOD définit la période pendant laquelle un patient est suivi dans le système de santé. Elle est calculée à partir des dates min et max des hospitalisations du patient. Cette information est essentielle pour les études longitudinales.
1Exercice 5.1 : Explorer les périodes d'observation
Affichez les 5 premières lignes de la table observation_period.
Exercice 5.1
Utilisez SELECT * FROM ... LIMIT 5
2Exercice 5.2 : Durée de suivi de notre patient
Calculez la durée de suivi en jours pour notre patient 8789342. Affichez le person_id, les dates de début et fin, et créez une colonne duree_suivi.
Exercice 5.2
Filtrez sur person_id et calculez la différence entre les dates
Bien joué, vous avez exploré toutes les informations concernant le patient et ses séjours !
Maintenant voyons en détail la table CONCEPT, centrale dans le modèle OMOP. Cette table contient toutes les terminologies standardisées (SNOMED, LOINC, RxNorm...). C'est la clé pour comprendre les codes utilisés dans les autres tables.
1Exercice 6.1 : Explorer les concepts
Affichez les 5 premiers concepts de la table concept.
Exercice 6.1
Utilisez SELECT * FROM ... LIMIT 5
2Exercice 6.2 : Trouver un concept
Recherchez le concept dont le concept_id est 8532.
Exercice 6.2
Filtrez avec WHERE sur concept_id
3Exercice 6.3 : Jointure patient-concept
Affichez le nom du genre (concept_name) pour notre patient 8789342. Joignez person et concept sur gender_concept_id.
Exercice 6.3
Joignez person avec concept sur gender_concept_id = concept_id
Félicitations ! Vous avez exploré les tables fondamentales du modèle OMOP.
Il est temps de mettre en pratique toutes vos connaissances en combinant plusieurs tables dans une seule requête. C'est le vrai travail d'un data scientist en santé : croiser les informations pour obtenir une vue complète des données patient.
1Exercice 7.1 : Synthèse - Vue complète des séjours
Créez une vue complète des séjours de l’hospitalisation 6687131 en combinant visit_detail, person, concept, care_site et death.
Affichez :
person_id
visit_occurrence_id
visit_detail_id
visit_detail_start_datetime
visit_detail_end_datetime
care_site_name : le nom du service
birth_datetime
gender_concept_name : le nom du genre
age : l'âge au moment du séjour
death_datetime : la date de décès (si applicable)
Exercice 7.1
Combinez visit_detail avec person, concept, care_site et death par des jointures
Niveau Intermédiaire : Données cliniques
Vous maîtrisez les bases du modèle OMOP. Ce niveau explore les tables cliniques : diagnostics, mesures, observations, procédures et dispositifs médicaux.
Ctrl/Cmd + Entrée : Exécuter
Ctrl/Cmd + Shift + Entrée : Exécuter et valider
1CONDITION
2MEASUREMENT
3OBSERVATION
4PROCEDURE
5DEVICE
6SYNTHÈSE
Bienvenue dans le niveau intermédiaire ! Nous allons explorer les tables cliniques du modèle OMOP.
Commençons par la table CONDITION_OCCURRENCE, qui contient les diagnostics posés. Dans OMOP, chaque diagnostic est encodé via un condition_concept_id standardisé.
La table CONDITION_OCCURRENCE stocke les diagnostics. Chaque ligne = un diagnostic posé pour un patient à une date donnée.
1Exercice 1.1 : Explorer la table CONDITION_OCCURRENCE
Découvrez la structure de la table condition_occurrence en affichant les 5 premières lignes.
Exercice 1.1
Utilisez SELECT * FROM ... LIMIT 5
2Exercice 1.2 : Compter les diagnostics du patient
Combien de diagnostics ont été posés pour notre patient 8789342 ?
Exercice 1.2
Utilisez COUNT(*) et filtrez sur person_id
3Exercice 1.3 : Lister les diagnostics avec leur nom
Affichez les diagnostics du patient avec leur nom lisible. Joignez la table concept pour traduire les condition_concept_id.
Exercice 1.3
Joignez avec concept sur condition_concept_id = concept_id
4Exercice 1.4 : Diagnostics uniques du patient
Un même diagnostic peut apparaître plusieurs fois (à chaque hospitalisation). Listez les diagnostics uniques du patient avec leur nombre d’occurrences.
Exercice 1.4
Utilisez GROUP BY et COUNT(*), triez par ordre décroissant
Nous avons maintenant une connaissance plus précise du patient, après avoir vu ses antécédents médicaux.
Explorons maintenant la table MEASUREMENT, qui contient les résultats quantitatifs : paramètres vitaux, examens biologiques, scores cliniques. C'est souvent la table la plus volumineuse d'une base OMOP.
La table MEASUREMENT stocke les mesures avec leur valeur numérique, leur unité et leurs bornes de référence.
1Exercice 2.1 : Explorer la table MEASUREMENT
Découvrez la structure de la table measurement en affichant les 5 premières lignes.
Exercice 2.1
Utilisez SELECT * FROM ... LIMIT 5
2Exercice 2.2 : Compter les mesures du patient
Combien de mesures ont été enregistrées pour notre patient 8789342 ?
Exercice 2.2
Utilisez COUNT(*) et filtrez sur person_id
3Exercice 2.3 : Types de mesures les plus fréquents
Quels types de mesures sont les plus fréquents pour ce patient ? Affichez le nom de chaque type de mesure et son nombre d’occurrences.
Exercice 2.3
Joignez avec concept, groupez et triez par count décroissant
4Exercice 2.4 : Évolution de la fréquence cardiaque
Analysez l’évolution de la fréquence cardiaque (Heart rate, concept_id = 3027018) du patient. Affichez la date, la valeur et l’unité.
Exercice 2.4
Filtrez sur le concept_id de la fréquence cardiaque, triez par datetime
5Exercice 2.5 : Statistiques sur la fréquence cardiaque
Calculez les statistiques de la fréquence cardiaque : valeur minimale, maximale et moyenne.
Exercice 2.5
Utilisez MIN(), MAX(), AVG() sur value_as_number
Explorons maintenant les observations cliniques. La table OBSERVATION capture les observations médicales : échelles de douleur, résultats d'examen clinique...
La table OBSERVATION contient des informations diverses : antécédents, habitudes, évaluations qualitatives.
1Exercice 3.1 : Explorer la table OBSERVATION
Découvrez la structure de la table observation en affichant les 5 premières lignes.
Exercice 3.1
Utilisez SELECT * FROM ... LIMIT 5
2Exercice 3.2 : Types d'observations
Quels types d’observations sont enregistrés pour ce patient ? Affichez le nom et le nombre d’occurrences de chaque type.
Exercice 3.2
Joignez avec concept, groupez et triez par count
3Exercice 3.3 : Mode d'oxygénation
Le patient a reçu différents modes d’oxygénation (concept_id = 4036936). Affichez la date et le mode d’administration stocké dans value_as_string.
Note : ce concept n’apparaît pas dans l’exercice précédent car il n’est pas disponible dans notre table concept réduite (licence SNOMED). Les données existent néanmoins dans observation.
Exercice 3.3
Filtrez sur observation_concept_id et affichez value_as_string
Voyons maintenant les actes médicaux réalisés. La table PROCEDURE_OCCURRENCE contient les procédures : interventions chirurgicales, examens d'imagerie, gestes techniques...
La table PROCEDURE_OCCURRENCE enregistre tous les actes médicaux réalisés sur le patient.
1Exercice 4.1 : Explorer la table PROCEDURE_OCCURRENCE
Découvrez la structure de la table procedure_occurrence en affichant les 5 premières lignes.
Exercice 4.1
Utilisez SELECT * FROM ... LIMIT 5
2Exercice 4.2 : Procédures du patient
Listez les procédures réalisées pour notre patient avec leur nom et leur nombre d’occurrences.
Exercice 4.2
Joignez avec concept et groupez par concept_name
3Exercice 4.3 : Chronologie des procédures
Affichez la chronologie des procédures du patient : date, nom de la procédure, triées par date. Utilisez DISTINCT pour éviter les doublons.
Exercice 4.3
Utilisez DISTINCT, joignez avec concept, triez par datetime
Terminons avec les dispositifs médicaux. La table DEVICE_EXPOSURE enregistre les dispositifs utilisés : sondes, cathéters, prothèses, pompes...
La table DEVICE_EXPOSURE contient les dispositifs médicaux utilisés pour le patient.
1Exercice 5.1 : Explorer la table DEVICE_EXPOSURE
Découvrez la structure de la table device_exposure en affichant les 5 premières lignes.
Exercice 5.1
Utilisez SELECT * FROM ... LIMIT 5
2Exercice 5.2 : Dispositifs utilisés
Quels dispositifs ont été utilisés pour ce patient ? Affichez le nom du dispositif et le nombre d’utilisations.
Exercice 5.2
Joignez avec concept et groupez par dispositif
Synthèse finale : Combinez vos connaissances pour créer une vue complète du patient. Vous allez croiser les données de plusieurs tables cliniques pour obtenir un résumé médical complet.
1Exercice 6.1 : Du format long au format large
Repartez de la requête de synthèse du niveau Facile (fournie ci-dessous) et enrichissez-la en ajoutant pour chaque séjour :
hr_min : la fréquence cardiaque minimale (measurement_concept_id = 3027018)
septic_shock : 1 si le patient a eu un choc septique durant le séjour (condition_concept_id = 10420211), 0 sinon
Commentaires