# Macros

Des macros ont été créées pour éviter des répétitions de parties de codes effectuant des transformations courantes ou volumineuses, et ainsi faciliter la lecture des scripts, seules les transformations sont répertoriées ici.

# format_date

Les dates du SNDS sont systématiquement adaptées au format de données PostgreSQL : 21/01/2020 → 2020-01-21

# set_id

La macro set_id crée une clé primaire à partir d’une liste de variables. Elle permet d’utiliser une clé de jointure composée d’une seule variable. Elle utilise pour cela la macro dbt_utils.surrogate_key de DBT qui crée un identifiant hexadécimal unique, hash d’une liste de variables. Les 63 premiers bits de l’identifiant sont ensuite convertis en entier.

Cette macro est employée pour créer la variable dcir_key_id, clé de jointure entre la table _ER_PRS_F et les tables affinées _ER_XXX_F ainsi que la variable dcir_visit_id qui identifie une visite de manière unique dans le DCIR.

Elle est également utilisée pour créer la clé primaire de toutes les tables OMOP. Dans ce cas, elle prend pour argument la variable qui identifie une instance de la table concernée dans les données sources. Par exemple, person_id = set_id(person_source_value)

# date_diff

La macro date_diff calcule le nombre de jours séparant deux dates au format PostgreSQL.

# categorize_facilities

La macro categorize_facilities filtre les établissements du DCIR dont les données sont également présentes dans les champs du PMSI, à partir de leur catégorie disponible dans la nomenclature IR_CET_V. Pour rappel, on garde uniquement les établissements pour lequels (etb_cat_rg1 > 1203) et (ete_cat_cod ≠114) ) ou bien qui ont ( ete_cat_cod ∊ (362, 422) ).

# numero_departement

La macro numero_departement donne le numéro du département sur 2 caractères, à partir d’un code commune.

Pour les DOM, il s'agit des 2 premiers caractères du code commune

Pour les autres, il s'agit de 0XX où XX sont les 2 premiers caractères du code commune

# drug_cases

La macro drug_cases calcule la quantité totale de médicaments remboursés lors d’une instance de la table ER_PHA_F.

  • pha_act_qsn renseigne le nombre de boîtes facturées

  • pha_unt_nbr_dses (Nomenclature IR_PHA_R)

Cas :

  1. Si pha_unt_nbr_dses n’est pas renseignée (le médicament n’est pas dans IR_PHA_R), on garde le nombre de boîtes

  2. Si pha_unt_nbr_dses est de la forme “3 pilules + 5 sachets”, on garde aussi le nombre de boîtes

  3. Si pha_unt_nbr_dses est de la forme “3 doses” ou “3”, on calcule le nombre de boîtes × nombre de doses (ici pha_act_qsn × 3)

  4. Si pha_unt_nbr_dses est de la forme “3 / 2mg” (3 doses de 2 mg), on garde le nombre de boîtes × nombre de doses (ici pha_act_qsn × 3)

 CASE
   WHEN pha_unt_nbr_dses IS NULL -- Certaines doses de médicaments ne sont pas dans IR_PHA_R
      THEN SUM(a.pha_act_qsn) -- On garde le nombre de boites

   WHEN (POSITION('+' IN pha_unt_nbr_dses) > 0) -- Certains médicaments sont sous la forme 3 pilules + 5 sachets : il est impossible de savoir lequel garder
      THEN SUM(a.pha_act_qsn) -- on garde juste le nombre de boites

   WHEN (POSITION('/' IN pha_unt_nbr_dses) = 0) -- doses de la forme "3 DOSES" ou "3", ce qui signifie que la boite contient 3 doses (solides ou liquides) et 3 doses solides.
      THEN
         (
         CASE
            WHEN (POSITION(' ' IN pha_unt_nbr_dses) > 0) -- Cas pour "3 doses"
               THEN CAST(SUBSTR(pha_unt_nbr_dses, 0, POSITION(' ' IN pha_unt_nbr_dses)) AS INTEGER) * SUM(a.pha_act_qsn) -- On suppose que la quantité vaut nombre de boites * 3

            ELSE -- Cas pour "3"
            pha_unt_nbr_dses::integer * SUM(a.pha_act_qsn) -- La quantité est le nombre de boîtes * 3
         END
         )

   ELSE -- Lots de la forme 3 / 2 ML (la boîte contient 3 doses de 2 ML)
      CAST(SUBSTR(pha_unt_nbr_dses, 0, POSITION('/' IN pha_unt_nbr_dses)) AS INTEGER) * SUM(a.pha_act_qsn) -- on suppose que la quantité est nombre de boîtes * 3
 END quantity

Accéder au code source

Le code source est disponible sur le dépôt Gitlab suivant (opens new window)