From 2456c66c628ba80df6ce054b8ea78dac8f9935f0 Mon Sep 17 00:00:00 2001 From: AnthonyMolinaro <31700317+AnthonyMolinaro@users.noreply.github.com> Date: Thu, 6 Jan 2022 16:08:16 -0500 Subject: [PATCH 01/39] CDM v5.3 to v5.4 conversion scripts, initial commit --- extras/v53_v54_conversion/README.txt | 13 ++ .../v53_v54_conversion/bigquery_migration.sql | 188 ++++++++++++++++++ .../v53_v54_conversion/impala_migration.sql | 176 ++++++++++++++++ .../v53_v54_conversion/netezza_migration.sql | 176 ++++++++++++++++ .../v53_v54_conversion/oracle_migration.sql | 179 +++++++++++++++++ .../postgresql_migration.sql | 175 ++++++++++++++++ .../v53_v54_conversion/redshift_migration.sql | 176 ++++++++++++++++ .../sqlserver_migration.sql | 179 +++++++++++++++++ 8 files changed, 1262 insertions(+) create mode 100644 extras/v53_v54_conversion/README.txt create mode 100644 extras/v53_v54_conversion/bigquery_migration.sql create mode 100644 extras/v53_v54_conversion/impala_migration.sql create mode 100644 extras/v53_v54_conversion/netezza_migration.sql create mode 100644 extras/v53_v54_conversion/oracle_migration.sql create mode 100644 extras/v53_v54_conversion/postgresql_migration.sql create mode 100644 extras/v53_v54_conversion/redshift_migration.sql create mode 100644 extras/v53_v54_conversion/sqlserver_migration.sql diff --git a/extras/v53_v54_conversion/README.txt b/extras/v53_v54_conversion/README.txt new file mode 100644 index 0000000..f621330 --- /dev/null +++ b/extras/v53_v54_conversion/README.txt @@ -0,0 +1,13 @@ + +README +------ + +v5.3 to v5.4 CDM conversion + +NOTES +----- + +The *_v53_to_v54_migration.sql scripts are SQL scripts that migrate a v5.3 CDM to a v5.4 CDM. +The changes implemented are found here: http://ohdsi.github.io/CommonDataModel/cdm54Changes.html. +Please replace @cdmDatabaseSchema with your schema name. +Links to database documentation are included in each script to facilitate debugging. \ No newline at end of file diff --git a/extras/v53_v54_conversion/bigquery_migration.sql b/extras/v53_v54_conversion/bigquery_migration.sql new file mode 100644 index 0000000..757629c --- /dev/null +++ b/extras/v53_v54_conversion/bigquery_migration.sql @@ -0,0 +1,188 @@ +-- http://ohdsi.github.io/CommonDataModel/cdm54Changes.html +-- BigQuery SQL references: +-- https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#creating_a_new_table_from_an_existing_table +-- https://cloud.google.com/bigquery/docs/manually-changing-schemas +-- https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#alter_column_set_data_type_statement +-- https://cloud.google.com/bigquery/docs/managing-tables#renaming-table +-- + +-- VISIT_OCCURRENCE +-- admitting_source_concept_id -> admitted_from_concept_id +-- admitting_source_value -> admitted_from_source_value +-- discharge_to_concept_id -> discharged_to_concept_id +-- discharge_to_source_value -> discharged_to_source_value + +alter table @cdmDatabaseSchema.visit_occurrence rename to visit_occurrence_old; +create table @cdmDatabaseSchema.visit_occurrence +as +select * EXCEPT(admitting_source_concept_id,admitting_source_value,discharge_to_concept_id,discharge_to_source_value), + admitting_source_concept_id as admitted_from_concept_id, + admitting_source_value as admitted_from_source_value, + discharge_to_concept_id as discharged_to_concept_id, + discharge_to_source_value as discharged_to_source_value +from visit_occurrence_old; + +-- +-- VISIT_DETAIL +-- admitting_source_concept_id -> admitted_from_concept_id +-- admitting_source_value -> admitted_from_source_value +-- discharge_to_concept_id -> discharged_to_concept_id +-- discharge_to_source_value -> discharged_to_source_value +-- visit_detail_parent_id -> parent_visit_detail_id + +alter table @cdmDatabaseSchema.visit_detail rename to visit_detail_old; +create table @cdmDatabaseSchema.visit_occurrence +as +select * EXCEPT(admitting_source_concept_id,admitting_source_value,discharge_to_concept_id,discharge_to_source_value,visit_detail_parent_id), + admitting_source_concept_id as admitted_from_concept_id, + admitting_source_value as admitted_from_source_value, + discharge_to_concept_id as discharged_to_concept_id, + discharge_to_source_value as discharged_to_source_value, + visit_detail_parent_id as parent_visit_detail_id +from visit_detail_old; + +-- PROCEDURE_OCCURRENCE +-- + Procedure_end_date +-- + Procedure_end_datetime + +alter table @cdmDatabaseSchema.procedure_occurrence add column procedure_end_date date; +alter table @cdmDatabaseSchema.procedure_occurrence add column procedure_end_datetime datetime; + +-- DEVICE_EXPOSURE +-- Unique_device_id -> Changed to varchar(255) (already a STRING on bigquery) +-- + Production_id +-- + Unit_concept_id +-- + Unit_source_value +-- + Unit_source_concept_id + +alter table @cdmDatabaseSchema.device_exposure add column production_id int64; +alter table @cdmDatabaseSchema.device_exposure add column unit_concept_id int64; +alter table @cdmDatabaseSchema.device_exposure add column unit_source_value string; +alter table @cdmDatabaseSchema.device_exposure add column unit_source_concept_id int64; + +-- MEASUREMENT +-- + Unit_source_concept_id +-- + Measurement_event_id +-- + Meas_event_field_concept_id + +alter table @cdmDatabaseSchema.measurement add column unit_source_id int64; +alter table @cdmDatabaseSchema.measurement add column measurement_event_id int64; +alter table @cdmDatabaseSchema.measurement add column meas_event_field_concept_id int64; + +-- OBSERVATION +-- + Value_source_value +-- + Observation_event_id +-- + Obs_event_field_concept_id + +alter table @cdmDatabaseSchema.observation add column value_source_value string; +alter table @cdmDatabaseSchema.observation add column observation_event_id int64; +alter table @cdmDatabaseSchema.observation add column obs_event_field_concept_id int64; + +-- NOTE +-- + Note_event_id +-- + Note_event_field_concept_id + +alter table @cdmDatabaseSchema.note add column note_event_id int64; +alter table @cdmDatabaseSchema.note add column note_event_field_concept_id int64; + +-- LOCATION +-- + Country_concept_id +-- + Country_source_value +-- + Latitude +-- + Longitude + +alter table @cdmDatabaseSchema.location add column country_concept_id int64; +alter table @cdmDatabaseSchema.location add column country_source_value string; +alter table @cdmDatabaseSchema.location add column latitude float64; +alter table @cdmDatabaseSchema.location add column longitude float64; + +-- EPISODE +create table @cdmDatabaseSchema.episode ( + episode_id INT64 not null, + person_id INT64 not null, + episode_concept_id INT64 not null, + episode_start_date date not null, + episode_start_datetime datetime null, + episode_end_date date null, + episode_end_datetime datetime null, + episode_parent_id INT64, + episode_number INT64, + episode_object_concept_id INT64 not null, + episode_type_concept_id INT64 not null, + episode_source_value STRING, + episode_source_concept_id INT64 ); + +-- EPISODE_EVENT +CREATE TABLE @cdmDatabaseSchema.EPISODE_EVENT ( + episode_id int64 NOT NULL, + event_id int64 NOT NULL, + episode_event_field_concept_id int64 NOT NULL ); + + +-- METADATA +-- + Metadata_id +-- + Value_as_number + +alter table @cdmDatabaseSchema.metadata add column metadata_id int64; +alter table @cdmDatabaseSchema.metadata add column value_as_number float64; + +-- CDM_SOURCE +-- Cdm_source_name -> Mandatory field +-- Cdm_source_abbreviation -> Mandatory field +-- Cdm_holder -> Mandatory field +-- Source_release_date -> Mandatory field +-- Cdm_release_date -> Mandatory field +-- + Cdm_version_concept_id + +alter table @cdmDatabaseSchema.cdm_source rename to cdm_source_v53; + +CREATE TABLE @cdmDatabaseSchema.cdm_source ( + cdm_source_name string NOT NULL, + cdm_source_abbreviation string NOT NULL, + cdm_holder string NOT NULL, + source_description string NULL, + source_documentation_reference string NULL, + cdm_etl_reference string NULL, + source_release_date datetime NOT NULL, + cdm_release_date datetime NOT NULL, + cdm_version string NULL, + cdm_version_concept_id int64 NOT NULL, + vocabulary_version string NOT NULL ); + +insert into @cdmDatabaseSchema.cdm_source +select cdm_source_name,cdm_source_abbreviation,cdm_holder, + source_description,source_documentation_reference,cdm_etl_reference, + source_release_date,cdm_release_date,'5.4', + 756265,vocabulary_version +from @cdmDatabaseSchema.cdm_source_v53; + + +-- VOCABULARY +-- Vocabulary_reference -> Non-mandatory field +-- Vocabulary_version -> Non-mandatory field +alter table @cdmDatabaseSchema.vocabulary rename to vocabulary_v53; + +CREATE TABLE @cdmDatabaseSchema.vocabulary ( + vocabulary_id string NOT NULL, + vocabulary_name string NOT NULL, + vocabulary_reference string NULL, + vocabulary_version string NULL, + vocabulary_concept_id int64 NOT NULL ); + +insert into @cdmDatabaseSchema.vocabulary +select vocabulary_id,vocabulary_name,vocabulary_reference, + vocabulary_version, vocabulary_concept_id +from @cdmDatabaseSchema.vocabulary_v53; + + +-- ATTRIBUTE_DEFINITION +drop table @cdmDatabaseSchema.attribute_definition; + +-- COHORT +CREATE TABLE @cdmDatabaseSchema.cohort ( + cohort_definition_id int64 NOT NULL, + subject_id int64 NOT NULL, + cohort_start_date datetime NOT NULL, + cohort_end_date datetime NOT NULL ); + + diff --git a/extras/v53_v54_conversion/impala_migration.sql b/extras/v53_v54_conversion/impala_migration.sql new file mode 100644 index 0000000..f7fc26e --- /dev/null +++ b/extras/v53_v54_conversion/impala_migration.sql @@ -0,0 +1,176 @@ +-- http://ohdsi.github.io/CommonDataModel/cdm54Changes.html +-- Impala SQL references: +-- https://docs.cloudera.com/documentation/enterprise/6/6.3/topics/impala_alter_table.html +-- +-- VISIT_OCCURRENCE +-- admitting_source_concept_id -> admitted_from_concept_id +-- admitting_source_value -> admitted_from_source_value +-- discharge_to_concept_id -> discharged_to_concept_id +-- discharge_to_source_value -> discharged_to_source_value + +alter table @cdmDatabaseSchema.visit_occurrence change admitting_source_concept_id admitted_from_concept_id int; +alter table @cdmDatabaseSchema.visit_occurrence change admitting_source_value admitted_from_source_value int; +alter table @cdmDatabaseSchema.visit_occurrence change discharge_to_concept_id discharged_to_concept_id int; +alter table @cdmDatabaseSchema.visit_occurrence change discharge_to_source_value discharged_to_source_value int; + +-- +-- VISIT_DETAIL +-- admitting_source_concept_id -> admitted_from_concept_id +-- admitting_source_value -> admitted_from_source_value +-- discharge_to_concept_id -> discharged_to_concept_id +-- discharge_to_source_value -> discharged_to_source_value +-- visit_detail_parent_id -> parent_visit_detail_id + +alter table @cdmDatabaseSchema.visit_detail change admitting_source_concept_id admitted_from_concept_id int; +alter table @cdmDatabaseSchema.visit_detail change admitting_source_value admitted_from_source_value int; +alter table @cdmDatabaseSchema.visit_detail change discharge_to_concept_id discharged_to_concept_id int; +alter table @cdmDatabaseSchema.visit_detail change discharge_to_source_value discharged_to_source_value int; +alter table @cdmDatabaseSchema.visit_detail change visit_detail_parent_id parent_visit_detail_id int; + +-- PROCEDURE_OCCURRENCE +-- + Procedure_end_date +-- + Procedure_end_datetime + +alter table @cdmDatabaseSchema.procedure_occurrence add columns (procedure_end_date timestamp); +alter table @cdmDatabaseSchema.procedure_occurrence add columns (procedure_end_datetime timestamp); + +-- DEVICE_EXPOSURE +-- Unique_device_id -> Changed to varchar(255) +-- + Production_id +-- + Unit_concept_id +-- + Unit_source_value +-- + Unit_source_concept_id + +alter table @cdmDatabaseSchema.device_exposure change unique_device_id unique_device_id varchar(300); +alter table @cdmDatabaseSchema.device_exposure add columns (production_id int); +alter table @cdmDatabaseSchema.device_exposure add columns (unit_concept_id int); +alter table @cdmDatabaseSchema.device_exposure add columns (unit_source_value int); +alter table @cdmDatabaseSchema.device_exposure add columns (unit_source_concept_id int); + +-- MEASUREMENT +-- + Unit_source_concept_id +-- + Measurement_event_id +-- + Meas_event_field_concept_id + +alter table @cdmDatabaseSchema.measurement add columns (unit_source_id int); +alter table @cdmDatabaseSchema.measurement add columns (measurement_event_id int); +alter table @cdmDatabaseSchema.measurement add columns (meas_event_field_concept_id int); + +-- OBSERVATION +-- + Value_source_value +-- + Observation_event_id +-- + Obs_event_field_concept_id + +alter table @cdmDatabaseSchema.observation add columns (value_source_value varchar(50)); +alter table @cdmDatabaseSchema.observation add columns (observation_event_id int); +alter table @cdmDatabaseSchema.observation add columns (obs_event_field_concept_id int); + +-- NOTE +-- + Note_event_id +-- + Note_event_field_concept_id + +alter table @cdmDatabaseSchema.note add columns (note_event_id int); +alter table @cdmDatabaseSchema.note add columns (note_event_field_concept_id int); + +-- LOCATION +-- + Country_concept_id +-- + Country_source_value +-- + Latitude +-- + Longitude + +alter table @cdmDatabaseSchema.location add columns (country_concept_id int); +alter table @cdmDatabaseSchema.location add columns (country_source_value varchar(80)); +alter table @cdmDatabaseSchema.location add columns (latitude float); +alter table @cdmDatabaseSchema.location add columns (longitude float); + +-- EPISODE +CREATE TABLE @cdmDatabaseSchema.EPISODE ( + episode_id int, + person_id int, + episode_concept_id int, + episode_start_date timestamp, + episode_start_datetime TIMESTAMP, + episode_end_date timestamp, + episode_end_datetime timestamp, + episode_parent_id int, + episode_number int, + episode_object_concept_id int, + episode_type_concept_id int, + episode_source_value varchar(50), + episode_source_concept_id int ); + +-- EPISODE_EVENT +CREATE TABLE @cdmDatabaseSchema.EPISODE_EVENT ( + episode_id int, + event_id int, + episode_event_field_concept_id int ); + + +-- METADATA +-- + Metadata_id +-- + Value_as_number + +alter table @cdmDatabaseSchema.metadata add columns (metadata_id int); +alter table @cdmDatabaseSchema.metadata add columns (value_as_number float); + +-- CDM_SOURCE +-- Cdm_source_name -> Mandatory field +-- Cdm_source_abbreviation -> Mandatory field +-- Cdm_holder -> Mandatory field +-- Source_release_date -> Mandatory field +-- Cdm_release_date -> Mandatory field +-- + Cdm_version_concept_id + +alter table @cdmDatabaseSchema.cdm_source rename to cdm_source_v53; + +CREATE TABLE @cdmDatabaseSchema.cdm_source ( + cdm_source_name varchar(255), + cdm_source_abbreviation varchar(25), + cdm_holder varchar(255), + source_description varchar(max), + source_documentation_reference varchar(255), + cdm_etl_reference varchar(255), + source_release_date timestamp, + cdm_release_date timestamp, + cdm_version varchar(10), + cdm_version_concept_id int, + vocabulary_version varchar(20)); + +insert into @cdmDatabaseSchema.cdm_source +select cdm_source_name,cdm_source_abbreviation,cdm_holder, + source_description,source_documentation_reference,cdm_etl_reference, + source_release_date,cdm_release_date,'5.4', + 756265,vocabulary_version +from @cdmDatabaseSchema.cdm_source_v53; + + +-- VOCABULARY +-- Vocabulary_reference -> Non-mandatory field +-- Vocabulary_version -> Non-mandatory field + +alter table @cdmDatabaseSchema.vocabulary rename to vocabulary_v53; + +CREATE TABLE @cdmDatabaseSchema.vocabulary ( + vocabulary_id varchar(20), + vocabulary_name varchar(255), + vocabulary_reference varchar(255), + vocabulary_version varchar(255), + vocabulary_concept_id int ); + +insert into @cdmDatabaseSchema.vocabulary +select vocabulary_id,vocabulary_name,vocabulary_reference, + vocabulary_version, vocabulary_concept_id +from @cdmDatabaseSchema.vocabulary_v53; + + +-- ATTRIBUTE_DEFINITION +drop table @cdmDatabaseSchema.attribute_definition; + +-- COHORT +CREATE TABLE @cdmDatabaseSchema.cohort ( + cohort_definition_id int, + subject_id int, + cohort_start_date timestamp, + cohort_end_date timestamp ); + + diff --git a/extras/v53_v54_conversion/netezza_migration.sql b/extras/v53_v54_conversion/netezza_migration.sql new file mode 100644 index 0000000..1af4181 --- /dev/null +++ b/extras/v53_v54_conversion/netezza_migration.sql @@ -0,0 +1,176 @@ +-- http://ohdsi.github.io/CommonDataModel/cdm54Changes.html +-- Netezza SQL references: +-- https://www.ibm.com/docs/en/psfa/7.2.1?topic=reference-alter-table +-- https://www.ibm.com/docs/en/psfa/7.2.1?topic=tables-add-drop-column +-- +-- VISIT_OCCURRENCE +-- admitting_source_concept_id -> admitted_from_concept_id +-- admitting_source_value -> admitted_from_source_value +-- discharge_to_concept_id -> discharged_to_concept_id +-- discharge_to_source_value -> discharged_to_source_value + +alter table @cdmDatabaseSchema.visit_occurrence rename column admitting_source_concept_id to admitted_from_concept_id; +alter table @cdmDatabaseSchema.visit_occurrence rename column admitting_source_value to admitted_from_source_value; +alter table @cdmDatabaseSchema.visit_occurrence rename column discharge_to_concept_id to discharged_to_concept_id; +alter table @cdmDatabaseSchema.visit_occurrence rename column discharge_to_source_value to discharged_to_source_value; + +-- +-- VISIT_DETAIL +-- admitting_source_concept_id -> admitted_from_concept_id +-- admitting_source_value -> admitted_from_source_value +-- discharge_to_concept_id -> discharged_to_concept_id +-- discharge_to_source_value -> discharged_to_source_value +-- visit_detail_parent_id -> parent_visit_detail_id + +alter table @cdmDatabaseSchema.visit_detail rename column admitting_source_concept_id to admitted_from_concept_id; +alter table @cdmDatabaseSchema.visit_detail rename column admitting_source_value to admitted_from_source_value; +alter table @cdmDatabaseSchema.visit_detail rename column discharge_to_concept_id to discharged_to_concept_id; +alter table @cdmDatabaseSchema.visit_detail rename column discharge_to_source_value to discharged_to_source_value; +alter table @cdmDatabaseSchema.visit_detail rename column visit_detail_parent_id to parent_visit_detail_id; + +-- PROCEDURE_OCCURRENCE +-- + Procedure_end_date +-- + Procedure_end_datetime + +alter table @cdmDatabaseSchema.procedure_occurrence add column procedure_end_date timestamp null; +alter table @cdmDatabaseSchema.procedure_occurrence add column procedure_end_datetime timestamp null; + +-- DEVICE_EXPOSURE +-- Unique_device_id -> Changed to varchar(255) +-- + Production_id +-- + Unit_concept_id +-- + Unit_source_value +-- + Unit_source_concept_id + +alter table @cdmDatabaseSchema.device_exposure modify column (unique_device_id varchar(300); +alter table @cdmDatabaseSchema.device_exposure add column production_id integer null; +alter table @cdmDatabaseSchema.device_exposure add column unit_concept_id integer null; +alter table @cdmDatabaseSchema.device_exposure add column unit_source_value varchar(50) null; +alter table @cdmDatabaseSchema.device_exposure add column unit_source_concept_id integer null; + +-- MEASUREMENT +-- + Unit_source_concept_id +-- + Measurement_event_id +-- + Meas_event_field_concept_id + +alter table @cdmDatabaseSchema.measurement add column unit_source_id integer default null; +alter table @cdmDatabaseSchema.measurement add column measurement_event_id bigint null; +alter table @cdmDatabaseSchema.measurement add column meas_event_field_concept_id integer null; + +-- OBSERVATION +-- + Value_source_value +-- + Observation_event_id +-- + Obs_event_field_concept_id + +alter table @cdmDatabaseSchema.observation add column value_source_value varchar(50) null; +alter table @cdmDatabaseSchema.observation add column observation_event_id bigint null; +alter table @cdmDatabaseSchema.observation add column obs_event_field_concept_id integer null; + +-- NOTE +-- + Note_event_id +-- + Note_event_field_concept_id + +alter table @cdmDatabaseSchema.note add column note_event_id bigint null; +alter table @cdmDatabaseSchema.note add column note_event_field_concept_id integer null; + +-- LOCATION +-- + Country_concept_id +-- + Country_source_value +-- + Latitude +-- + Longitude + +alter table @cdmDatabaseSchema.location add column country_concept_id integer null; +alter table @cdmDatabaseSchema.location add column country_source_value varchar(80) null; +alter table @cdmDatabaseSchema.location add column latitude float null; +alter table @cdmDatabaseSchema.location add column longitude float null; + +-- EPISODE +CREATE TABLE @cdmDatabaseSchema.EPISODE ( + episode_id bigint NOT NULL, + person_id bigint NOT NULL, + episode_concept_id integer NOT NULL, + episode_start_date timestamp NOT NULL, + episode_start_datetime TIMESTAMP NULL, + episode_end_date timestamp NULL, + episode_end_datetime TIMESTAMP NULL, + episode_parent_id bigint NULL, + episode_number integer NULL, + episode_object_concept_id integer NOT NULL, + episode_type_concept_id integer NOT NULL, + episode_source_value varchar(50) NULL, + episode_source_concept_id integer NULL ); + +-- EPISODE_EVENT +CREATE TABLE @cdmDatabaseSchema.EPISODE_EVENT ( + episode_id bigint NOT NULL, + event_id bigint NOT NULL, + episode_event_field_concept_id integer NOT NULL ); + + +-- METADATA +-- + Metadata_id +-- + Value_as_number + +alter table @cdmDatabaseSchema.metadata add column metadata_id integer null; +alter table @cdmDatabaseSchema.metadata add column value_as_number float null; + +-- CDM_SOURCE +-- Cdm_source_name -> Mandatory field +-- Cdm_source_abbreviation -> Mandatory field +-- Cdm_holder -> Mandatory field +-- Source_release_date -> Mandatory field +-- Cdm_release_date -> Mandatory field +-- + Cdm_version_concept_id + +alter table @cdmDatabaseSchema.cdm_source rename to cdm_source_v53; + +CREATE TABLE @cdmDatabaseSchema.cdm_source ( + cdm_source_name varchar(255) NOT NULL, + cdm_source_abbreviation varchar(25) NOT NULL, + cdm_holder varchar(255) NOT NULL, + source_description varchar(1000) NULL, + source_documentation_reference varchar(255) NULL, + cdm_etl_reference varchar(255) NULL, + source_release_date timestamp NOT NULL, + cdm_release_date timestamp NOT NULL, + cdm_version varchar(10) NULL, + cdm_version_concept_id integer NOT NULL, + vocabulary_version varchar(20) NOT NULL ); + +insert into @cdmDatabaseSchema.cdm_source +select cdm_source_name,cdm_source_abbreviation,cdm_holder, + source_description,source_documentation_reference,cdm_etl_reference, + source_release_date,cdm_release_date,'5.4', + 756265,vocabulary_version +from @cdmDatabaseSchema.cdm_source_v53; + + +-- VOCABULARY +-- Vocabulary_reference -> Non-mandatory field +-- Vocabulary_version -> Non-mandatory field +alter table @cdmDatabaseSchema.vocabulary rename to vocabulary_v53; + +CREATE TABLE @cdmDatabaseSchema.vocabulary ( + vocabulary_id varchar(20) NOT NULL, + vocabulary_name varchar(255) NOT NULL, + vocabulary_reference varchar(255) NULL, + vocabulary_version varchar(255) NULL, + vocabulary_concept_id integer NOT NULL ); + +insert into @cdmDatabaseSchema.vocabulary +select vocabulary_id,vocabulary_name,vocabulary_reference, + vocabulary_version, vocabulary_concept_id +from @cdmDatabaseSchema.vocabulary_v53; + + +-- ATTRIBUTE_DEFINITION +drop table @cdmDatabaseSchema.attribute_definition; + +-- COHORT +CREATE TABLE @cdmDatabaseSchema.cohort ( + cohort_definition_id integer NOT NULL, + subject_id integer NOT NULL, + cohort_start_date timestamp NOT NULL, + cohort_end_date timestamp NOT NULL ); + + diff --git a/extras/v53_v54_conversion/oracle_migration.sql b/extras/v53_v54_conversion/oracle_migration.sql new file mode 100644 index 0000000..a195176 --- /dev/null +++ b/extras/v53_v54_conversion/oracle_migration.sql @@ -0,0 +1,179 @@ +-- http://ohdsi.github.io/CommonDataModel/cdm54Changes.html +-- Oracle SQL references: +-- https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/ALTER-TABLE.html#GUID-552E7373-BF93-477D-9DA3-B2C9386F2877 +-- https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/Data-Types.html#GUID-0DC7FFAA-F03F-4448-8487-F2592496A510 +-- https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/RENAME.html#GUID-573347CE-3EB8-42E5-B4D5-EF71CA06FAFC +-- +-- VISIT_OCCURRENCE +-- admitting_source_concept_id -> admitted_from_concept_id +-- admitting_source_value -> admitted_from_source_value +-- discharge_to_concept_id -> discharged_to_concept_id +-- discharge_to_source_value -> discharged_to_source_value + +alter table @cdmDatabaseSchema.visit_occurrence rename column admitting_source_concept_id to admitted_from_concept_id; +alter table @cdmDatabaseSchema.visit_occurrence rename column admitting_source_value to admitted_from_source_value; +alter table @cdmDatabaseSchema.visit_occurrence rename column discharge_to_concept_id to discharged_to_concept_id; +alter table @cdmDatabaseSchema.visit_occurrence rename column discharge_to_source_value to discharged_to_source_value; + +-- +-- VISIT_DETAIL +-- admitting_source_concept_id -> admitted_from_concept_id +-- admitting_source_value -> admitted_from_source_value +-- discharge_to_concept_id -> discharged_to_concept_id +-- discharge_to_source_value -> discharged_to_source_value +-- visit_detail_parent_id -> parent_visit_detail_id + +alter table @cdmDatabaseSchema.visit_detail rename column admitting_source_concept_id to admitted_from_concept_id; +alter table @cdmDatabaseSchema.visit_detail rename column admitting_source_value to admitted_from_source_value; +alter table @cdmDatabaseSchema.visit_detail rename column discharge_to_concept_id to discharged_to_concept_id; +alter table @cdmDatabaseSchema.visit_detail rename column discharge_to_source_value to discharged_to_source_value; +alter table @cdmDatabaseSchema.visit_detail rename column visit_detail_parent_id to parent_visit_detail_id; + +-- PROCEDURE_OCCURRENCE +-- + Procedure_end_date +-- + Procedure_end_datetime + +alter table @cdmDatabaseSchema.procedure_occurrence add (procedure_end_date date default null); +alter table @cdmDatabaseSchema.procedure_occurrence add (procedure_end_datetime timestamp default null); + +-- DEVICE_EXPOSURE +-- Unique_device_id -> Changed to varchar(255) +-- + Production_id +-- + Unit_concept_id +-- + Unit_source_value +-- + Unit_source_concept_id + +alter table @cdmDatabaseSchema.device_exposure modify (unique_device_id varchar2(300)); +alter table @cdmDatabaseSchema.device_exposure add (production_id number default null); +alter table @cdmDatabaseSchema.device_exposure add (unit_concept_id number default null); +alter table @cdmDatabaseSchema.device_exposure add (unit_source_value varchar2(50) default null); +alter table @cdmDatabaseSchema.device_exposure add (unit_source_concept_id number default null); + +-- MEASUREMENT +-- + Unit_source_concept_id +-- + Measurement_event_id +-- + Meas_event_field_concept_id + +alter table @cdmDatabaseSchema.measurement add (unit_source_id number default null); +alter table @cdmDatabaseSchema.measurement add (measurement_event_id number default null); +alter table @cdmDatabaseSchema.measurement add (meas_event_field_concept_id number default null); + +-- OBSERVATION +-- + Value_source_value +-- + Observation_event_id +-- + Obs_event_field_concept_id + +alter table @cdmDatabaseSchema.observation add (value_source_value varchar2(50) default null); +alter table @cdmDatabaseSchema.observation add (observation_event_id number default null); +alter table @cdmDatabaseSchema.observation add (obs_event_field_concept_id number default null); + +-- NOTE +-- + Note_event_id +-- + Note_event_field_concept_id + +alter table @cdmDatabaseSchema.note add (note_event_id number default null); +alter table @cdmDatabaseSchema.note add (note_event_field_concept_id number default null); + +-- LOCATION +-- + Country_concept_id +-- + Country_source_value +-- + Latitude +-- + Longitude + +alter table @cdmDatabaseSchema.location add (country_concept_id number default null); +alter table @cdmDatabaseSchema.location add (country_source_value varchar2(80) default null); +alter table @cdmDatabaseSchema.location add (latitude float default null); +alter table @cdmDatabaseSchema.location add (longitude float default null); + +-- EPISODE +CREATE TABLE @cdmDatabaseSchema.EPISODE ( + episode_id number NOT NULL, + person_id number NOT NULL, + episode_concept_id number NOT NULL, + episode_start_date date NOT NULL, + episode_start_datetime TIMESTAMP NULL, + episode_end_date date NULL, + episode_end_datetime TIMESTAMP NULL, + episode_parent_id number NULL, + episode_number number NULL, + episode_object_concept_id number NOT NULL, + episode_type_concept_id number NOT NULL, + episode_source_value varchar2(50) NULL, + episode_source_concept_id number NULL ); + +-- EPISODE_EVENT +CREATE TABLE @cdmDatabaseSchema.EPISODE_EVENT ( + episode_id number NOT NULL, + event_id number NOT NULL, + episode_event_field_concept_id number NOT NULL ); + + +-- METADATA +-- + Metadata_id +-- + Value_as_number + +alter table @cdmDatabaseSchema.metadata add (metadata_id number default null); +alter table @cdmDatabaseSchema.metadata add (value_as_number float default null); + +-- CDM_SOURCE +-- Cdm_source_name -> Mandatory field +-- Cdm_source_abbreviation -> Mandatory field +-- Cdm_holder -> Mandatory field +-- Source_release_date -> Mandatory field +-- Cdm_release_date -> Mandatory field +-- + Cdm_version_concept_id + +rename @cdmDatabaseSchema.cdm_source to cdm_source_v53; + +CREATE TABLE @cdmDatabaseSchema.cdm_source ( + cdm_source_name varchar2(255) NOT NULL, + cdm_source_abbreviation varchar2(25) NOT NULL, + cdm_holder varchar2(255) NOT NULL, + -- 32767 bytes if MAX_STRING_SIZE = EXTENDED + -- 4000 bytes if MAX_STRING_SIZE = STANDARD + source_description varchar2(32767) NULL, + source_documentation_reference varchar2(255) NULL, + cdm_etl_reference varchar2(255) NULL, + source_release_date date NOT NULL, + cdm_release_date date NOT NULL, + cdm_version varchar2(10) NULL, + cdm_version_concept_id number NOT NULL, + vocabulary_version varchar2(20) NOT NULL ); + +insert into @cdmDatabaseSchema.cdm_source +select cdm_source_name,cdm_source_abbreviation,cdm_holder, + source_description,source_documentation_reference,cdm_etl_reference, + source_release_date,cdm_release_date,'5.4', + 756265,vocabulary_version +from @cdmDatabaseSchema.cdm_source_v53; + + +-- VOCABULARY +-- Vocabulary_reference -> Non-mandatory field +-- Vocabulary_version -> Non-mandatory field +rename @cdmDatabaseSchema.vocabulary to vocabulary_v53; + +CREATE TABLE @cdmDatabaseSchema.vocabulary ( + vocabulary_id varchar2(20) NOT NULL, + vocabulary_name varchar2(255) NOT NULL, + vocabulary_reference varchar2(255) NULL, + vocabulary_version varchar2(255) NULL, + vocabulary_concept_id number NOT NULL ); + +insert into @cdmDatabaseSchema.vocabulary +select vocabulary_id,vocabulary_name,vocabulary_reference, + vocabulary_version, vocabulary_concept_id +from @cdmDatabaseSchema.vocabulary_v53; + + +-- ATTRIBUTE_DEFINITION +drop table @cdmDatabaseSchema.attribute_definition; + +-- COHORT +CREATE TABLE @cdmDatabaseSchema.cohort ( + cohort_definition_id number NOT NULL, + subject_id number NOT NULL, + cohort_start_date date NOT NULL, + cohort_end_date date NOT NULL ); + + diff --git a/extras/v53_v54_conversion/postgresql_migration.sql b/extras/v53_v54_conversion/postgresql_migration.sql new file mode 100644 index 0000000..9e8e202 --- /dev/null +++ b/extras/v53_v54_conversion/postgresql_migration.sql @@ -0,0 +1,175 @@ +-- http://ohdsi.github.io/CommonDataModel/cdm54Changes.html +-- PostgreSQL SQL references: +-- https://www.postgresql.org/docs/current/sql-altertable.html +-- +-- VISIT_OCCURRENCE +-- admitting_source_concept_id -> admitted_from_concept_id +-- admitting_source_value -> admitted_from_source_value +-- discharge_to_concept_id -> discharged_to_concept_id +-- discharge_to_source_value -> discharged_to_source_value + +alter table @cdmDatabaseSchema.visit_occurrence rename column admitting_source_concept_id to admitted_from_concept_id; +alter table @cdmDatabaseSchema.visit_occurrence rename column admitting_source_value to admitted_from_source_value; +alter table @cdmDatabaseSchema.visit_occurrence rename column discharge_to_concept_id to discharged_to_concept_id; +alter table @cdmDatabaseSchema.visit_occurrence rename column discharge_to_source_value to discharged_to_source_value; + +-- +-- VISIT_DETAIL +-- admitting_source_concept_id -> admitted_from_concept_id +-- admitting_source_value -> admitted_from_source_value +-- discharge_to_concept_id -> discharged_to_concept_id +-- discharge_to_source_value -> discharged_to_source_value +-- visit_detail_parent_id -> parent_visit_detail_id + +alter table @cdmDatabaseSchema.visit_detail rename column admitting_source_concept_id to admitted_from_concept_id; +alter table @cdmDatabaseSchema.visit_detail rename column admitting_source_value to admitted_from_source_value; +alter table @cdmDatabaseSchema.visit_detail rename column discharge_to_concept_id to discharged_to_concept_id; +alter table @cdmDatabaseSchema.visit_detail rename column discharge_to_source_value to discharged_to_source_value; +alter table @cdmDatabaseSchema.visit_detail rename column visit_detail_parent_id to parent_visit_detail_id; + +-- PROCEDURE_OCCURRENCE +-- + Procedure_end_date +-- + Procedure_end_datetime + +alter table @cdmDatabaseSchema.procedure_occurrence add column procedure_end_date date default null; +alter table @cdmDatabaseSchema.procedure_occurrence add column procedure_end_datetime timestamp default null; + +-- DEVICE_EXPOSURE +-- Unique_device_id -> Changed to varchar(255) +-- + Production_id +-- + Unit_concept_id +-- + Unit_source_value +-- + Unit_source_concept_id + +alter table @cdmDatabaseSchema.device_exposure alter column unique_device_id type varchar(300); +alter table @cdmDatabaseSchema.device_exposure add column production_id integer default null; +alter table @cdmDatabaseSchema.device_exposure add column unit_concept_id integer default null; +alter table @cdmDatabaseSchema.device_exposure add column unit_source_value varchar(50) default null; +alter table @cdmDatabaseSchema.device_exposure add column unit_source_concept_id integer default null; + +-- MEASUREMENT +-- + Unit_source_concept_id +-- + Measurement_event_id +-- + Meas_event_field_concept_id + +alter table @cdmDatabaseSchema.measurement add column unit_source_id integer default null; +alter table @cdmDatabaseSchema.measurement add column measurement_event_id bigint default null; +alter table @cdmDatabaseSchema.measurement add column meas_event_field_concept_id integer default null; + +-- OBSERVATION +-- + Value_source_value +-- + Observation_event_id +-- + Obs_event_field_concept_id + +alter table @cdmDatabaseSchema.observation add column value_source_value varchar(50) default null; +alter table @cdmDatabaseSchema.observation add column observation_event_id bigint default null; +alter table @cdmDatabaseSchema.observation add column obs_event_field_concept_id integer default null; + +-- NOTE +-- + Note_event_id +-- + Note_event_field_concept_id + +alter table @cdmDatabaseSchema.note add column note_event_id bigint default null; +alter table @cdmDatabaseSchema.note add column note_event_field_concept_id integer default null; + +-- LOCATION +-- + Country_concept_id +-- + Country_source_value +-- + Latitude +-- + Longitude + +alter table @cdmDatabaseSchema.location add column country_concept_id integer default null; +alter table @cdmDatabaseSchema.location add column country_source_value varchar(80) default null; +alter table @cdmDatabaseSchema.location add column latitude numeric default null; +alter table @cdmDatabaseSchema.location add column longitude numeric default null; + +-- EPISODE +CREATE TABLE @cdmDatabaseSchema.EPISODE ( + episode_id bigint NOT NULL, + person_id bigint NOT NULL, + episode_concept_id integer NOT NULL, + episode_start_date date NOT NULL, + episode_start_datetime TIMESTAMP NULL, + episode_end_date date NULL, + episode_end_datetime TIMESTAMP NULL, + episode_parent_id bigint NULL, + episode_number integer NULL, + episode_object_concept_id integer NOT NULL, + episode_type_concept_id integer NOT NULL, + episode_source_value varchar(50) NULL, + episode_source_concept_id integer NULL ); + +-- EPISODE_EVENT +CREATE TABLE @cdmDatabaseSchema.EPISODE_EVENT ( + episode_id bigint NOT NULL, + event_id bigint NOT NULL, + episode_event_field_concept_id integer NOT NULL ); + + +-- METADATA +-- + Metadata_id +-- + Value_as_number + +alter table @cdmDatabaseSchema.metadata add column metadata_id integer default null; +alter table @cdmDatabaseSchema.metadata add column value_as_number numeric default null; + +-- CDM_SOURCE +-- Cdm_source_name -> Mandatory field +-- Cdm_source_abbreviation -> Mandatory field +-- Cdm_holder -> Mandatory field +-- Source_release_date -> Mandatory field +-- Cdm_release_date -> Mandatory field +-- + Cdm_version_concept_id + +alter table @cdmDatabaseSchema.cdm_source rename to cdm_source_v53; + +CREATE TABLE @cdmDatabaseSchema.cdm_source ( + cdm_source_name varchar(255) NOT NULL, + cdm_source_abbreviation varchar(25) NOT NULL, + cdm_holder varchar(255) NOT NULL, + source_description text NULL, + source_documentation_reference varchar(255) NULL, + cdm_etl_reference varchar(255) NULL, + source_release_date date NOT NULL, + cdm_release_date date NOT NULL, + cdm_version varchar(10) NULL, + cdm_version_concept_id integer NOT NULL, + vocabulary_version varchar(20) NOT NULL ); + +insert into @cdmDatabaseSchema.cdm_source +select cdm_source_name,cdm_source_abbreviation,cdm_holder, + source_description,source_documentation_reference,cdm_etl_reference, + source_release_date,cdm_release_date,'5.4', + 756265,vocabulary_version +from @cdmDatabaseSchema.cdm_source_v53; + + +-- VOCABULARY +-- Vocabulary_reference -> Non-mandatory field +-- Vocabulary_version -> Non-mandatory field +alter table @cdmDatabaseSchema.vocabulary rename to vocabulary_v53; + +CREATE TABLE @cdmDatabaseSchema.vocabulary ( + vocabulary_id varchar(20) NOT NULL, + vocabulary_name varchar(255) NOT NULL, + vocabulary_reference varchar(255) NULL, + vocabulary_version varchar(255) NULL, + vocabulary_concept_id integer NOT NULL ); + +insert into @cdmDatabaseSchema.vocabulary +select vocabulary_id,vocabulary_name,vocabulary_reference, + vocabulary_version, vocabulary_concept_id +from @cdmDatabaseSchema.vocabulary_v53; + + +-- ATTRIBUTE_DEFINITION +drop table @cdmDatabaseSchema.attribute_definition; + +-- COHORT +CREATE TABLE @cdmDatabaseSchema.cohort ( + cohort_definition_id integer NOT NULL, + subject_id integer NOT NULL, + cohort_start_date date NOT NULL, + cohort_end_date date NOT NULL ); + + diff --git a/extras/v53_v54_conversion/redshift_migration.sql b/extras/v53_v54_conversion/redshift_migration.sql new file mode 100644 index 0000000..3b757fe --- /dev/null +++ b/extras/v53_v54_conversion/redshift_migration.sql @@ -0,0 +1,176 @@ +-- http://ohdsi.github.io/CommonDataModel/cdm54Changes.html +-- Redshift SQL references: +-- https://docs.aws.amazon.com/redshift/latest/dg/r_ALTER_TABLE_examples_basic.html +-- https://docs.aws.amazon.com/redshift/latest/dg/r_ALTER_TABLE_COL_ex-add-drop.html +-- +-- VISIT_OCCURRENCE +-- admitting_source_concept_id -> admitted_from_concept_id +-- admitting_source_value -> admitted_from_source_value +-- discharge_to_concept_id -> discharged_to_concept_id +-- discharge_to_source_value -> discharged_to_source_value + +alter table @cdmDatabaseSchema.visit_occurrence rename column admitting_source_concept_id to admitted_from_concept_id; +alter table @cdmDatabaseSchema.visit_occurrence rename column admitting_source_value to admitted_from_source_value; +alter table @cdmDatabaseSchema.visit_occurrence rename column discharge_to_concept_id to discharged_to_concept_id; +alter table @cdmDatabaseSchema.visit_occurrence rename column discharge_to_source_value to discharged_to_source_value; + +-- +-- VISIT_DETAIL +-- admitting_source_concept_id -> admitted_from_concept_id +-- admitting_source_value -> admitted_from_source_value +-- discharge_to_concept_id -> discharged_to_concept_id +-- discharge_to_source_value -> discharged_to_source_value +-- visit_detail_parent_id -> parent_visit_detail_id + +alter table @cdmDatabaseSchema.visit_detail rename column admitting_source_concept_id to admitted_from_concept_id; +alter table @cdmDatabaseSchema.visit_detail rename column admitting_source_value to admitted_from_source_value; +alter table @cdmDatabaseSchema.visit_detail rename column discharge_to_concept_id to discharged_to_concept_id; +alter table @cdmDatabaseSchema.visit_detail rename column discharge_to_source_value to discharged_to_source_value; +alter table @cdmDatabaseSchema.visit_detail rename column visit_detail_parent_id to parent_visit_detail_id; + +-- PROCEDURE_OCCURRENCE +-- + Procedure_end_date +-- + Procedure_end_datetime + +alter table @cdmDatabaseSchema.procedure_occurrence add column procedure_end_date date default null; +alter table @cdmDatabaseSchema.procedure_occurrence add column procedure_end_datetime timestamp default null; + +-- DEVICE_EXPOSURE +-- Unique_device_id -> Changed to varchar(255) +-- + Production_id +-- + Unit_concept_id +-- + Unit_source_value +-- + Unit_source_concept_id + +alter table @cdmDatabaseSchema.device_exposure alter column unique_device_id varchar(300); +alter table @cdmDatabaseSchema.device_exposure add column production_id integer default null; +alter table @cdmDatabaseSchema.device_exposure add column unit_concept_id integer default null; +alter table @cdmDatabaseSchema.device_exposure add column unit_source_value varchar(50) default null; +alter table @cdmDatabaseSchema.device_exposure add column unit_source_concept_id integer default null; + +-- MEASUREMENT +-- + Unit_source_concept_id +-- + Measurement_event_id +-- + Meas_event_field_concept_id + +alter table @cdmDatabaseSchema.measurement add column unit_source_id integer default null; +alter table @cdmDatabaseSchema.measurement add column measurement_event_id bigint default null; +alter table @cdmDatabaseSchema.measurement add column meas_event_field_concept_id integer default null; + +-- OBSERVATION +-- + Value_source_value +-- + Observation_event_id +-- + Obs_event_field_concept_id + +alter table @cdmDatabaseSchema.observation add column value_source_value varchar(50) default null; +alter table @cdmDatabaseSchema.observation add column observation_event_id bigint default null; +alter table @cdmDatabaseSchema.observation add column obs_event_field_concept_id integer default null; + +-- NOTE +-- + Note_event_id +-- + Note_event_field_concept_id + +alter table @cdmDatabaseSchema.note add column note_event_id bigint default null; +alter table @cdmDatabaseSchema.note add column note_event_field_concept_id integer default null; + +-- LOCATION +-- + Country_concept_id +-- + Country_source_value +-- + Latitude +-- + Longitude + +alter table @cdmDatabaseSchema.location add column country_concept_id integer default null; +alter table @cdmDatabaseSchema.location add column country_source_value varchar(80) default null; +alter table @cdmDatabaseSchema.location add column latitude float default null; +alter table @cdmDatabaseSchema.location add column longitude float default null; + +-- EPISODE +CREATE TABLE @cdmDatabaseSchema.EPISODE ( + episode_id bigint NOT NULL, + person_id bigint NOT NULL, + episode_concept_id integer NOT NULL, + episode_start_date date NOT NULL, + episode_start_datetime TIMESTAMP NULL, + episode_end_date date NULL, + episode_end_datetime TIMESTAMP NULL, + episode_parent_id bigint NULL, + episode_number integer NULL, + episode_object_concept_id integer NOT NULL, + episode_type_concept_id integer NOT NULL, + episode_source_value varchar(50) NULL, + episode_source_concept_id integer NULL ); + +-- EPISODE_EVENT +CREATE TABLE @cdmDatabaseSchema.EPISODE_EVENT ( + episode_id bigint NOT NULL, + event_id bigint NOT NULL, + episode_event_field_concept_id integer NOT NULL ); + + +-- METADATA +-- + Metadata_id +-- + Value_as_number + +alter table @cdmDatabaseSchema.metadata add column metadata_id integer default null; +alter table @cdmDatabaseSchema.metadata add column value_as_number float default null; + +-- CDM_SOURCE +-- Cdm_source_name -> Mandatory field +-- Cdm_source_abbreviation -> Mandatory field +-- Cdm_holder -> Mandatory field +-- Source_release_date -> Mandatory field +-- Cdm_release_date -> Mandatory field +-- + Cdm_version_concept_id + +alter table @cdmDatabaseSchema.cdm_source rename to cdm_source_v53; + +CREATE TABLE @cdmDatabaseSchema.cdm_source ( + cdm_source_name varchar(255) NOT NULL, + cdm_source_abbreviation varchar(25) NOT NULL, + cdm_holder varchar(255) NOT NULL, + source_description varchar(MAX) NULL, + source_documentation_reference varchar(255) NULL, + cdm_etl_reference varchar(255) NULL, + source_release_date date NOT NULL, + cdm_release_date date NOT NULL, + cdm_version varchar(10) NULL, + cdm_version_concept_id integer NOT NULL, + vocabulary_version varchar(20) NOT NULL ); + +insert into @cdmDatabaseSchema.cdm_source +select cdm_source_name,cdm_source_abbreviation,cdm_holder, + source_description,source_documentation_reference,cdm_etl_reference, + source_release_date,cdm_release_date,'5.4', + 756265,vocabulary_version +from @cdmDatabaseSchema.cdm_source_v53; + + +-- VOCABULARY +-- Vocabulary_reference -> Non-mandatory field +-- Vocabulary_version -> Non-mandatory field +alter table @cdmDatabaseSchema.vocabulary rename to vocabulary_v53; + +CREATE TABLE @cdmDatabaseSchema.vocabulary ( + vocabulary_id varchar(20) NOT NULL, + vocabulary_name varchar(255) NOT NULL, + vocabulary_reference varchar(255) NULL, + vocabulary_version varchar(255) NULL, + vocabulary_concept_id integer NOT NULL ); + +insert into @cdmDatabaseSchema.vocabulary +select vocabulary_id,vocabulary_name,vocabulary_reference, + vocabulary_version, vocabulary_concept_id +from @cdmDatabaseSchema.vocabulary_v53; + + +-- ATTRIBUTE_DEFINITION +drop table @cdmDatabaseSchema.attribute_definition; + +-- COHORT +CREATE TABLE @cdmDatabaseSchema.cohort ( + cohort_definition_id integer NOT NULL, + subject_id integer NOT NULL, + cohort_start_date date NOT NULL, + cohort_end_date date NOT NULL ); + + diff --git a/extras/v53_v54_conversion/sqlserver_migration.sql b/extras/v53_v54_conversion/sqlserver_migration.sql new file mode 100644 index 0000000..f692992 --- /dev/null +++ b/extras/v53_v54_conversion/sqlserver_migration.sql @@ -0,0 +1,179 @@ +-- http://ohdsi.github.io/CommonDataModel/cdm54Changes.html +-- SQL SERVER SQL References: +-- https://docs.microsoft.com/en-us/sql/relational-databases/tables/rename-columns-database-engine?view=sql-server-ver15 +-- https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-rename-transact-sql?view=sql-server-ver15 +-- https://docs.microsoft.com/en-us/sql/relational-databases/tables/add-columns-to-a-table-database-engine?view=sql-server-ver15 +-- https://docs.microsoft.com/en-us/sql/relational-databases/tables/modify-columns-database-engine?view=sql-server-ver15 +-- https://docs.microsoft.com/en-us/sql/t-sql/data-types/data-types-transact-sql?view=sql-server-ver15 +-- +-- VISIT_OCCURRENCE +-- admitting_source_concept_id -> admitted_from_concept_id +-- admitting_source_value -> admitted_from_source_value +-- discharge_to_concept_id -> discharged_to_concept_id +-- discharge_to_source_value -> discharged_to_source_value + +EXEC sp_rename '@cdmDatabaseSchema.visit_occurrence.admitting_source_concept_id', 'admitted_from_concept_id', 'COLUMN'; +EXEC sp_rename '@cdmDatabaseSchema.visit_occurrence.admitting_source_value', 'admitted_from_source_value', 'COLUMN'; +EXEC sp_rename '@cdmDatabaseSchema.visit_occurrence.discharge_to_concept_id', 'discharged_to_concept_id', 'COLUMN'; +EXEC sp_rename '@cdmDatabaseSchema.visit_occurrence.discharge_to_source_value', 'discharged_to_source_value', 'COLUMN'; + +-- +-- VISIT_DETAIL +-- admitting_source_concept_id -> admitted_from_concept_id +-- admitting_source_value -> admitted_from_source_value +-- discharge_to_concept_id -> discharged_to_concept_id +-- discharge_to_source_value -> discharged_to_source_value +-- visit_detail_parent_id -> parent_visit_detail_id + +EXEC sp_rename '@cdmDatabaseSchema.visit_detail.admitting_source_concept_id', 'admitted_from_concept_id', 'COLUMN'; +EXEC sp_rename '@cdmDatabaseSchema.visit_detail.admitting_source_value', 'admitted_from_source_value', 'COLUMN'; +EXEC sp_rename '@cdmDatabaseSchema.visit_detail.discharge_to_concept_id', 'discharged_to_concept_id', 'COLUMN'; +EXEC sp_rename '@cdmDatabaseSchema.visit_detail.discharge_to_source_value', 'discharged_to_source_value', 'COLUMN'; +EXEC sp_rename '@cdmDatabaseSchema.visit_detail.visit_detail_parent_id', 'parent_visit_detail_id', 'COLUMN'; + +-- PROCEDURE_OCCURRENCE +-- + Procedure_end_date +-- + Procedure_end_datetime + +alter table @cdmDatabaseSchema.procedure_occurrence add procedure_end_date date null; +alter table @cdmDatabaseSchema.procedure_occurrence add procedure_end_datetime datetime null; + +-- DEVICE_EXPOSURE +-- Unique_device_id -> Changed to varchar(255) +-- + Production_id +-- + Unit_concept_id +-- + Unit_source_value +-- + Unit_source_concept_id + +alter table @cdmDatabaseSchema.device_exposure alter column unique_device_id varchar(300); +alter table @cdmDatabaseSchema.device_exposure add production_id int null; +alter table @cdmDatabaseSchema.device_exposure add unit_concept_id int null; +alter table @cdmDatabaseSchema.device_exposure add unit_source_value varchar(50) null; +alter table @cdmDatabaseSchema.device_exposure add unit_source_concept_id int null; + +-- MEASUREMENT +-- + Unit_source_concept_id +-- + Measurement_event_id +-- + Meas_event_field_concept_id + +alter table @cdmDatabaseSchema.measurement add unit_source_id int null; +alter table @cdmDatabaseSchema.measurement add measurement_event_id bigint null; +alter table @cdmDatabaseSchema.measurement add meas_event_field_concept_id int null; + +-- OBSERVATION +-- + Value_source_value +-- + Observation_event_id +-- + Obs_event_field_concept_id + +alter table @cdmDatabaseSchema.observation add value_source_value varchar(50) null; +alter table @cdmDatabaseSchema.observation add observation_event_id bigint null; +alter table @cdmDatabaseSchema.observation add obs_event_field_concept_id int null; + +-- NOTE +-- + Note_event_id +-- + Note_event_field_concept_id + +alter table @cdmDatabaseSchema.note add note_event_id bigint null; +alter table @cdmDatabaseSchema.note add note_event_field_concept_id int null; + +-- LOCATION +-- + Country_concept_id +-- + Country_source_value +-- + Latitude +-- + Longitude + +alter table @cdmDatabaseSchema.location add country_concept_id int null; +alter table @cdmDatabaseSchema.location add country_source_value varchar(80) null; +alter table @cdmDatabaseSchema.location add latitude numeric null; +alter table @cdmDatabaseSchema.location add longitude numeric null; + +-- EPISODE +CREATE TABLE @cdmDatabaseSchema.EPISODE ( + episode_id bigint NOT NULL, + person_id bigint NOT NULL, + episode_concept_id int NOT NULL, + episode_start_date date NOT NULL, + episode_start_datetime datetime NULL, + episode_end_date date NULL, + episode_end_datetime datetime NULL, + episode_parent_id bigint NULL, + episode_number int NULL, + episode_object_concept_id int NOT NULL, + episode_type_concept_id int NOT NULL, + episode_source_value varchar(50) NULL, + episode_source_concept_id int NULL ); + +-- EPISODE_EVENT +CREATE TABLE @cdmDatabaseSchema.EPISODE_EVENT ( + episode_id bigint NOT NULL, + event_id bigint NOT NULL, + episode_event_field_concept_id int NOT NULL ); + + +-- METADATA +-- + Metadata_id +-- + Value_as_number + +alter table @cdmDatabaseSchema.metadata add metadata_id int null; +alter table @cdmDatabaseSchema.metadata add value_as_number numeric null; + +-- CDM_SOURCE +-- Cdm_source_name -> Mandatory field +-- Cdm_source_abbreviation -> Mandatory field +-- Cdm_holder -> Mandatory field +-- Source_release_date -> Mandatory field +-- Cdm_release_date -> Mandatory field +-- + Cdm_version_concept_id + +EXEC sp_rename '@cdmDatabaseSchema.cdm_source', 'cdm_source_v53'; + +CREATE TABLE @cdmDatabaseSchema.cdm_source ( + cdm_source_name varchar(255) NOT NULL, + cdm_source_abbreviation varchar(25) NOT NULL, + cdm_holder varchar(255) NOT NULL, + source_description varchar(MAX) NULL, + source_documentation_reference varchar(255) NULL, + cdm_etl_reference varchar(255) NULL, + source_release_date date NOT NULL, + cdm_release_date date NOT NULL, + cdm_version varchar(10) NULL, + cdm_version_concept_id int NOT NULL, + vocabulary_version varchar(20) NOT NULL ); + +insert into @cdmDatabaseSchema.cdm_source +select cdm_source_name,cdm_source_abbreviation,cdm_holder, + source_description,source_documentation_reference,cdm_etl_reference, + source_release_date,cdm_release_date,'5.4', + 756265,vocabulary_version +from @cdmDatabaseSchema.cdm_source_v53; + + +-- VOCABULARY +-- Vocabulary_reference -> Non-mandatory field +-- Vocabulary_version -> Non-mandatory field +EXEC sp_rename '@cdmDatabaseSchema.vocabulary', 'vocabulary_v53'; + +CREATE TABLE @cdmDatabaseSchema.vocabulary ( + vocabulary_id varchar(20) NOT NULL, + vocabulary_name varchar(255) NOT NULL, + vocabulary_reference varchar(255) NULL, + vocabulary_version varchar(255) NULL, + vocabulary_concept_id int NOT NULL ); + +insert into @cdmDatabaseSchema.vocabulary +select vocabulary_id,vocabulary_name,vocabulary_reference, + vocabulary_version, vocabulary_concept_id +from @cdmDatabaseSchema.vocabulary_v53; + + +-- ATTRIBUTE_DEFINITION +drop table @cdmDatabaseSchema.attribute_definition; + +-- COHORT +CREATE TABLE @cdmDatabaseSchema.cohort ( + cohort_definition_id int NOT NULL, + subject_id int NOT NULL, + cohort_start_date date NOT NULL, + cohort_end_date date NOT NULL ); + + From 64a8fd6645e1fbaf81c1726d05eedf6d5b052fc3 Mon Sep 17 00:00:00 2001 From: AnthonyMolinaro <31700317+AnthonyMolinaro@users.noreply.github.com> Date: Thu, 27 Jan 2022 16:23:19 -0500 Subject: [PATCH 02/39] Script to assist in migration from 6.0 to 5.4 --- .../compare_column_attributes.sql | 23 + .../compare_column_names.sql | 45 ++ .../output_of_compare_column_attributes.txt | 182 +++++++ .../output_of_compare_column_names.txt | 481 ++++++++++++++++++ .../redshift_v60_v54_migration.sql | 134 +++++ 5 files changed, 865 insertions(+) create mode 100644 extras/v60_v54_conversion/compare_column_attributes.sql create mode 100644 extras/v60_v54_conversion/compare_column_names.sql create mode 100644 extras/v60_v54_conversion/output_of_compare_column_attributes.txt create mode 100644 extras/v60_v54_conversion/output_of_compare_column_names.txt create mode 100644 extras/v60_v54_conversion/redshift_v60_v54_migration.sql diff --git a/extras/v60_v54_conversion/compare_column_attributes.sql b/extras/v60_v54_conversion/compare_column_attributes.sql new file mode 100644 index 0000000..ca1df0c --- /dev/null +++ b/extras/v60_v54_conversion/compare_column_attributes.sql @@ -0,0 +1,23 @@ +with cdm_v540 as ( +select * + from information_schema.columns + where table_schema = 'cdm_v540' --> ENTER YOUR V5.4 CDM HERE + and table_name not in ('cohort','cohort_attribute','cohort_definition') +), cdm_v601 as ( +select * + from information_schema.columns + where table_schema = 'cdm_v601' --> ENTER YOUR V6.0 CDM HERE + and table_name not in ('cohort','cohort_attribute','cohort_definition') +) +select a.table_name, + a.column_name, + a.is_nullable v54_nullable, + b.is_nullable v60_nullable, + a.data_type v54_datatype, + b.data_type v60_datatype + from cdm_v540 a + join cdm_v601 b + on a.table_name = b.table_name + and a.column_name = b.column_name + and (a.is_nullable != b.is_nullable or a.data_type != b.data_type) +order by 1,2; \ No newline at end of file diff --git a/extras/v60_v54_conversion/compare_column_names.sql b/extras/v60_v54_conversion/compare_column_names.sql new file mode 100644 index 0000000..1c810f6 --- /dev/null +++ b/extras/v60_v54_conversion/compare_column_names.sql @@ -0,0 +1,45 @@ +-- +-- RETRIEVE TABLE AND COLUMN NAMES FOR V5.4 AND V6.0 CDMS. +-- SUPPLY THE NAME OF EACH SCHEMA WHERE INDICATED. +-- THE "STATUS" COLUMN: +-- "IN BOTH": INDICATES COLUMN IS IN BOTH 5.4 AND 6.0 +-- "MISSING FROM v6.0.1": INDICATES COLUMN IS IN BOTH 5.4 BUT NOT 6.0 AND NEEDS TO BE ADDED OR RENAMED +-- "MISSING FROM v5.4.0": INDICATES COLUMN IS IN BOTH 6.0 BUT NOT 5.4 AND NEED TO BE DROPPED OR RENAMED + +with cdm_v540 as ( +select * + from information_schema.columns + where table_schema = 'cdm_v540' --> YOUR V5.4 CDM SCHEMA NAME HERE + and table_name not in ('_version','cohort','cohort_attribute','cohort_definition') +), cdm_v601 as ( +select * + from information_schema.columns + where table_schema = 'cdm_v601' --> YOUR V6.0 CDM SCHEMA NAME HERE + and table_name not in ('_version','cohort','cohort_attribute','cohort_definition') +) +select a.table_name, + a.column_name, + 'IN BOTH' status + from cdm_v540 a + join cdm_v601 b + on a.table_name = b.table_name + and a.column_name = b.column_name +union all +select a.table_name, + a.column_name, + 'MISSING FROM v6.0.1' status + from cdm_v540 a + left join cdm_v601 b + on a.table_name = b.table_name + and a.column_name = b.column_name + where b.column_name is null +union all +select b.table_name, + b.column_name, + 'MISSING FROM v5.4.0' status + from cdm_v540 a + right join cdm_v601 b + on a.table_name = b.table_name + and a.column_name = b.column_name + where a.column_name is null +order by 1,3; \ No newline at end of file diff --git a/extras/v60_v54_conversion/output_of_compare_column_attributes.txt b/extras/v60_v54_conversion/output_of_compare_column_attributes.txt new file mode 100644 index 0000000..69e37c8 --- /dev/null +++ b/extras/v60_v54_conversion/output_of_compare_column_attributes.txt @@ -0,0 +1,182 @@ +table_name | column_name | v54_nullable | v60_nullable | v54_datatype | v60_datatype +----------------------+--------------------------------+--------------+--------------+-----------------------------+---------------------------- +care_site | care_site_id | YES | NO | bigint | bigint +care_site | place_of_service_concept_id | YES | NO | integer | integer +cdm_source | cdm_holder | NO | YES | character varying | character varying +cdm_source | cdm_release_date | NO | YES | date | date +cdm_source | cdm_source_abbreviation | NO | YES | character varying | character varying +cdm_source | source_release_date | NO | YES | date | date +cdm_source | vocabulary_version | NO | YES | character varying | character varying +concept | concept_class_id | YES | NO | character varying | character varying +concept | concept_code | YES | NO | character varying | character varying +concept | concept_id | YES | NO | integer | integer +concept | concept_name | YES | NO | character varying | character varying +concept | domain_id | YES | NO | character varying | character varying +concept | valid_end_date | YES | NO | date | date +concept | valid_start_date | YES | NO | date | date +concept | vocabulary_id | YES | NO | character varying | character varying +concept_ancestor | ancestor_concept_id | YES | NO | integer | integer +concept_ancestor | descendant_concept_id | YES | NO | integer | integer +concept_ancestor | max_levels_of_separation | YES | NO | integer | integer +concept_ancestor | min_levels_of_separation | YES | NO | integer | integer +concept_class | concept_class_concept_id | YES | NO | integer | integer +concept_class | concept_class_id | YES | NO | character varying | character varying +concept_class | concept_class_name | YES | NO | character varying | character varying +concept_relationship | concept_id_1 | YES | NO | integer | integer +concept_relationship | concept_id_2 | YES | NO | integer | integer +concept_relationship | relationship_id | YES | NO | character varying | character varying +concept_relationship | valid_end_date | YES | NO | date | date +concept_relationship | valid_start_date | YES | NO | date | date +concept_synonym | concept_id | YES | NO | integer | integer +concept_synonym | concept_synonym_name | YES | NO | character varying | character varying +concept_synonym | language_concept_id | YES | NO | integer | integer +condition_era | condition_concept_id | YES | NO | integer | integer +condition_era | condition_era_id | YES | NO | bigint | bigint +condition_era | person_id | YES | NO | bigint | bigint +condition_occurrence | condition_concept_id | YES | NO | integer | integer +condition_occurrence | condition_occurrence_id | YES | NO | bigint | bigint +condition_occurrence | condition_source_concept_id | YES | NO | integer | integer +condition_occurrence | condition_start_date | YES | NO | date | date +condition_occurrence | condition_status_concept_id | YES | NO | integer | integer +condition_occurrence | condition_type_concept_id | YES | NO | integer | integer +condition_occurrence | person_id | YES | NO | bigint | bigint +cost | cost_event_id | YES | NO | bigint | bigint +cost | cost_id | YES | NO | bigint | bigint +cost | payer_plan_period_id | YES | YES | integer | bigint +device_exposure | device_concept_id | YES | NO | integer | integer +device_exposure | device_exposure_id | YES | NO | bigint | bigint +device_exposure | device_exposure_start_date | YES | NO | date | date +device_exposure | device_source_concept_id | YES | NO | integer | integer +device_exposure | device_type_concept_id | YES | NO | integer | integer +device_exposure | person_id | YES | NO | bigint | bigint +domain | domain_concept_id | YES | NO | integer | integer +domain | domain_id | YES | NO | character varying | character varying +domain | domain_name | YES | NO | character varying | character varying +dose_era | dose_era_id | YES | NO | bigint | bigint +dose_era | dose_value | YES | NO | double precision | double precision +dose_era | drug_concept_id | YES | NO | integer | integer +dose_era | person_id | YES | NO | bigint | bigint +dose_era | unit_concept_id | YES | NO | integer | integer +drug_era | drug_concept_id | YES | NO | integer | integer +drug_era | drug_era_id | YES | NO | bigint | bigint +drug_era | person_id | YES | NO | bigint | bigint +drug_exposure | drug_concept_id | YES | NO | integer | integer +drug_exposure | drug_exposure_end_date | YES | NO | date | date +drug_exposure | drug_exposure_id | YES | NO | bigint | bigint +drug_exposure | drug_exposure_start_date | YES | NO | date | date +drug_exposure | drug_source_concept_id | YES | NO | integer | integer +drug_exposure | drug_type_concept_id | YES | NO | integer | integer +drug_exposure | person_id | YES | NO | bigint | bigint +drug_strength | drug_concept_id | YES | NO | integer | integer +drug_strength | ingredient_concept_id | YES | NO | integer | integer +drug_strength | valid_end_date | YES | NO | date | date +drug_strength | valid_start_date | YES | NO | date | date +fact_relationship | domain_concept_id_1 | YES | NO | integer | integer +fact_relationship | domain_concept_id_2 | YES | NO | integer | integer +fact_relationship | fact_id_1 | YES | NO | bigint | bigint +fact_relationship | fact_id_2 | YES | NO | bigint | bigint +fact_relationship | relationship_concept_id | YES | NO | integer | integer +location | location_id | YES | NO | bigint | bigint +measurement | measurement_concept_id | YES | NO | integer | integer +measurement | measurement_date | YES | NO | date | date +measurement | measurement_id | YES | NO | bigint | bigint +measurement | measurement_source_concept_id | YES | NO | integer | integer +measurement | measurement_time | YES | YES | timestamp without time zone | character varying +measurement | measurement_type_concept_id | YES | NO | integer | integer +measurement | person_id | YES | NO | bigint | bigint +metadata | metadata_concept_id | YES | NO | integer | integer +metadata | metadata_type_concept_id | YES | NO | integer | integer +metadata | name | YES | NO | character varying | character varying +note | encoding_concept_id | YES | NO | integer | integer +note | language_concept_id | YES | NO | integer | integer +note | note_class_concept_id | YES | NO | integer | integer +note | note_date | YES | NO | date | date +note | note_id | YES | NO | bigint | integer +note | note_text | YES | NO | character varying | character varying +note | note_type_concept_id | YES | NO | integer | integer +note | person_id | YES | NO | bigint | bigint +note | provider_id | YES | YES | integer | bigint +note_nlp | lexical_variant | YES | NO | character varying | character varying +note_nlp | nlp_date | YES | NO | date | date +note_nlp | note_id | YES | NO | bigint | integer +note_nlp | note_nlp_id | YES | NO | bigint | bigint +observation | observation_concept_id | YES | NO | integer | integer +observation | observation_datetime | YES | NO | timestamp without time zone | timestamp without time zone +observation | observation_id | YES | NO | bigint | bigint +observation | observation_source_concept_id | YES | NO | integer | integer +observation | observation_type_concept_id | YES | NO | integer | integer +observation | person_id | YES | NO | bigint | bigint +observation_period | observation_period_end_date | YES | NO | date | date +observation_period | observation_period_id | YES | NO | bigint | bigint +observation_period | observation_period_start_date | YES | NO | date | date +observation_period | period_type_concept_id | YES | NO | integer | integer +observation_period | person_id | YES | NO | bigint | bigint +payer_plan_period | payer_concept_id | YES | NO | integer | integer +payer_plan_period | payer_plan_period_end_date | YES | NO | date | date +payer_plan_period | payer_plan_period_id | YES | NO | integer | bigint +payer_plan_period | payer_plan_period_start_date | YES | NO | date | date +payer_plan_period | payer_source_concept_id | YES | NO | integer | integer +payer_plan_period | person_id | YES | NO | integer | bigint +payer_plan_period | plan_concept_id | YES | NO | integer | integer +payer_plan_period | plan_source_concept_id | YES | NO | integer | integer +payer_plan_period | sponsor_concept_id | YES | NO | integer | integer +person | ethnicity_concept_id | YES | NO | integer | integer +person | ethnicity_source_concept_id | YES | NO | integer | integer +person | gender_concept_id | YES | NO | integer | integer +person | gender_source_concept_id | YES | NO | integer | integer +person | person_id | YES | NO | bigint | bigint +person | race_concept_id | YES | NO | integer | integer +person | race_source_concept_id | YES | NO | integer | integer +person | year_of_birth | YES | NO | integer | integer +procedure_occurrence | person_id | YES | NO | bigint | bigint +procedure_occurrence | procedure_concept_id | YES | NO | integer | integer +procedure_occurrence | procedure_datetime | YES | NO | timestamp without time zone | timestamp without time zone +procedure_occurrence | procedure_occurrence_id | YES | NO | bigint | bigint +procedure_occurrence | procedure_source_concept_id | YES | NO | integer | integer +procedure_occurrence | procedure_type_concept_id | YES | NO | integer | integer +provider | gender_concept_id | YES | NO | integer | integer +provider | gender_source_concept_id | YES | NO | integer | integer +provider | provider_id | YES | NO | bigint | bigint +provider | specialty_concept_id | YES | NO | integer | integer +provider | specialty_source_concept_id | YES | NO | integer | integer +provider | year_of_birth | YES | YES | bigint | integer +relationship | defines_ancestry | YES | NO | character varying | character varying +relationship | is_hierarchical | YES | NO | character varying | character varying +relationship | relationship_concept_id | YES | NO | integer | integer +relationship | relationship_id | YES | NO | character varying | character varying +relationship | relationship_name | YES | NO | character varying | character varying +relationship | reverse_relationship_id | YES | NO | character varying | character varying +source_to_concept_map | source_code | YES | NO | character varying | character varying +source_to_concept_map | source_concept_id | YES | NO | integer | integer +source_to_concept_map | source_vocabulary_id | YES | NO | character varying | character varying +source_to_concept_map | target_concept_id | YES | NO | integer | integer +source_to_concept_map | target_vocabulary_id | YES | NO | character varying | character varying +source_to_concept_map | valid_end_date | YES | NO | date | date +source_to_concept_map | valid_start_date | YES | NO | date | date +specimen | person_id | YES | NO | bigint | bigint +specimen | specimen_concept_id | YES | NO | integer | integer +specimen | specimen_date | YES | NO | date | date +specimen | specimen_id | YES | NO | bigint | bigint +specimen | specimen_type_concept_id | YES | NO | integer | integer +visit_detail | admitted_from_concept_id | YES | YES | integer | character varying +visit_detail | admitted_from_source_value | YES | NO | character varying | integer +visit_detail | care_site_id | YES | YES | integer | bigint +visit_detail | person_id | YES | NO | bigint | bigint +visit_detail | preceding_visit_detail_id | YES | YES | integer | bigint +visit_detail | provider_id | YES | YES | integer | bigint +visit_detail | visit_detail_concept_id | YES | NO | integer | integer +visit_detail | visit_detail_end_date | YES | NO | date | date +visit_detail | visit_detail_id | YES | NO | bigint | bigint +visit_detail | visit_detail_source_concept_id | YES | NO | integer | integer +visit_detail | visit_detail_start_date | YES | NO | date | date +visit_detail | visit_detail_type_concept_id | YES | NO | integer | integer +visit_detail | visit_occurrence_id | YES | NO | bigint | bigint +visit_occurrence | admitted_from_concept_id | YES | NO | integer | integer +visit_occurrence | person_id | YES | NO | bigint | bigint +visit_occurrence | visit_concept_id | YES | NO | integer | integer +visit_occurrence | visit_end_datetime | YES | NO | timestamp without time zone | timestamp without time zone +visit_occurrence | visit_occurrence_id | YES | NO | bigint | bigint +visit_occurrence | visit_source_concept_id | YES | NO | integer | integer +visit_occurrence | visit_start_datetime | YES | NO | timestamp without time zone | timestamp without time zone +visit_occurrence | visit_type_concept_id | YES | NO | integer | integer +vocabulary | vocabulary_reference | YES | NO | character varying | character varying diff --git a/extras/v60_v54_conversion/output_of_compare_column_names.txt b/extras/v60_v54_conversion/output_of_compare_column_names.txt new file mode 100644 index 0000000..c2c2711 --- /dev/null +++ b/extras/v60_v54_conversion/output_of_compare_column_names.txt @@ -0,0 +1,481 @@ + +table_name | column_name | status +----------------------+--------------------------------+-------------------- +care_site | care_site_id | IN BOTH +care_site | place_of_service_concept_id | IN BOTH +care_site | location_id | IN BOTH +care_site | care_site_name | IN BOTH +care_site | care_site_source_value | IN BOTH +care_site | place_of_service_source_value | IN BOTH +cdm_source | cdm_source_name | IN BOTH +cdm_source | cdm_source_abbreviation | IN BOTH +cdm_source | cdm_holder | IN BOTH +cdm_source | source_description | IN BOTH +cdm_source | source_documentation_reference | IN BOTH +cdm_source | cdm_etl_reference | IN BOTH +cdm_source | source_release_date | IN BOTH +cdm_source | cdm_release_date | IN BOTH +cdm_source | cdm_version | IN BOTH +cdm_source | vocabulary_version | IN BOTH +cdm_source | cdm_version_concept_id | MISSING FROM v6.0.1 +concept | concept_id | IN BOTH +concept | valid_start_date | IN BOTH +concept | valid_end_date | IN BOTH +concept | concept_name | IN BOTH +concept | domain_id | IN BOTH +concept | vocabulary_id | IN BOTH +concept | concept_class_id | IN BOTH +concept | standard_concept | IN BOTH +concept | concept_code | IN BOTH +concept | invalid_reason | IN BOTH +concept_ancestor | ancestor_concept_id | IN BOTH +concept_ancestor | descendant_concept_id | IN BOTH +concept_ancestor | min_levels_of_separation | IN BOTH +concept_ancestor | max_levels_of_separation | IN BOTH +concept_class | concept_class_concept_id | IN BOTH +concept_class | concept_class_id | IN BOTH +concept_class | concept_class_name | IN BOTH +concept_relationship | concept_id_1 | IN BOTH +concept_relationship | concept_id_2 | IN BOTH +concept_relationship | valid_start_date | IN BOTH +concept_relationship | valid_end_date | IN BOTH +concept_relationship | relationship_id | IN BOTH +concept_relationship | invalid_reason | IN BOTH +concept_synonym | concept_id | IN BOTH +concept_synonym | language_concept_id | IN BOTH +concept_synonym | concept_synonym_name | IN BOTH +condition_era | condition_era_id | IN BOTH +condition_era | person_id | IN BOTH +condition_era | condition_concept_id | IN BOTH +condition_era | condition_occurrence_count | IN BOTH +condition_era | condition_era_start_datetime | MISSING FROM v5.4.0 +condition_era | condition_era_end_datetime | MISSING FROM v5.4.0 +condition_era | condition_era_start_date | MISSING FROM v6.0.1 +condition_era | condition_era_end_date | MISSING FROM v6.0.1 +condition_occurrence | condition_occurrence_id | IN BOTH +condition_occurrence | person_id | IN BOTH +condition_occurrence | condition_concept_id | IN BOTH +condition_occurrence | condition_start_date | IN BOTH +condition_occurrence | condition_start_datetime | IN BOTH +condition_occurrence | condition_end_date | IN BOTH +condition_occurrence | condition_end_datetime | IN BOTH +condition_occurrence | condition_type_concept_id | IN BOTH +condition_occurrence | provider_id | IN BOTH +condition_occurrence | visit_occurrence_id | IN BOTH +condition_occurrence | visit_detail_id | IN BOTH +condition_occurrence | condition_source_concept_id | IN BOTH +condition_occurrence | condition_status_concept_id | IN BOTH +condition_occurrence | stop_reason | IN BOTH +condition_occurrence | condition_source_value | IN BOTH +condition_occurrence | condition_status_source_value | IN BOTH +cost | cost_id | IN BOTH +cost | cost_event_id | IN BOTH +cost | cost_type_concept_id | IN BOTH +cost | currency_concept_id | IN BOTH +cost | payer_plan_period_id | IN BOTH +cost | revenue_code_concept_id | IN BOTH +cost | drg_concept_id | IN BOTH +cost | drg_source_value | IN BOTH +cost | person_id | MISSING FROM v5.4.0 +cost | cost_event_field_concept_id | MISSING FROM v5.4.0 +cost | cost_concept_id | MISSING FROM v5.4.0 +cost | cost_source_concept_id | MISSING FROM v5.4.0 +cost | cost_source_value | MISSING FROM v5.4.0 +cost | cost | MISSING FROM v5.4.0 +cost | incurred_date | MISSING FROM v5.4.0 +cost | billed_date | MISSING FROM v5.4.0 +cost | paid_date | MISSING FROM v5.4.0 +cost | revenue_code_source_value | MISSING FROM v5.4.0 +cost | total_charge | MISSING FROM v6.0.1 +cost | total_cost | MISSING FROM v6.0.1 +cost | total_paid | MISSING FROM v6.0.1 +cost | paid_by_payer | MISSING FROM v6.0.1 +cost | paid_by_patient | MISSING FROM v6.0.1 +cost | paid_patient_copay | MISSING FROM v6.0.1 +cost | paid_patient_coinsurance | MISSING FROM v6.0.1 +cost | paid_patient_deductible | MISSING FROM v6.0.1 +cost | paid_by_primary | MISSING FROM v6.0.1 +cost | paid_ingredient_cost | MISSING FROM v6.0.1 +cost | paid_dispensing_fee | MISSING FROM v6.0.1 +cost | amount_allowed | MISSING FROM v6.0.1 +cost | cost_domain_id | MISSING FROM v6.0.1 +cost | reveue_code_source_value | MISSING FROM v6.0.1 +death | person_id | MISSING FROM v6.0.1 +death | death_date | MISSING FROM v6.0.1 +death | death_datetime | MISSING FROM v6.0.1 +death | death_type_concept_id | MISSING FROM v6.0.1 +death | cause_concept_id | MISSING FROM v6.0.1 +death | cause_source_concept_id | MISSING FROM v6.0.1 +death | cause_source_value | MISSING FROM v6.0.1 +device_exposure | device_exposure_id | IN BOTH +device_exposure | person_id | IN BOTH +device_exposure | device_concept_id | IN BOTH +device_exposure | device_exposure_start_date | IN BOTH +device_exposure | device_exposure_start_datetime | IN BOTH +device_exposure | device_exposure_end_date | IN BOTH +device_exposure | device_exposure_end_datetime | IN BOTH +device_exposure | device_type_concept_id | IN BOTH +device_exposure | quantity | IN BOTH +device_exposure | provider_id | IN BOTH +device_exposure | visit_occurrence_id | IN BOTH +device_exposure | visit_detail_id | IN BOTH +device_exposure | device_source_concept_id | IN BOTH +device_exposure | device_source_value | IN BOTH +device_exposure | unique_device_id | IN BOTH +device_exposure | production_id | MISSING FROM v6.0.1 +device_exposure | unit_concept_id | MISSING FROM v6.0.1 +device_exposure | unit_source_value | MISSING FROM v6.0.1 +device_exposure | unit_source_concept_id | MISSING FROM v6.0.1 +domain | domain_concept_id | IN BOTH +domain | domain_id | IN BOTH +domain | domain_name | IN BOTH +dose_era | dose_era_id | IN BOTH +dose_era | person_id | IN BOTH +dose_era | drug_concept_id | IN BOTH +dose_era | unit_concept_id | IN BOTH +dose_era | dose_value | IN BOTH +dose_era | dose_era_start_datetime | MISSING FROM v5.4.0 +dose_era | dose_era_end_datetime | MISSING FROM v5.4.0 +dose_era | dose_era_start_date | MISSING FROM v6.0.1 +dose_era | dose_era_end_date | MISSING FROM v6.0.1 +drug_era | drug_era_id | IN BOTH +drug_era | person_id | IN BOTH +drug_era | drug_concept_id | IN BOTH +drug_era | drug_exposure_count | IN BOTH +drug_era | gap_days | IN BOTH +drug_era | drug_era_start_datetime | MISSING FROM v5.4.0 +drug_era | drug_era_end_datetime | MISSING FROM v5.4.0 +drug_era | drug_era_start_date | MISSING FROM v6.0.1 +drug_era | drug_era_end_date | MISSING FROM v6.0.1 +drug_exposure | drug_exposure_id | IN BOTH +drug_exposure | person_id | IN BOTH +drug_exposure | drug_concept_id | IN BOTH +drug_exposure | drug_exposure_start_date | IN BOTH +drug_exposure | drug_exposure_start_datetime | IN BOTH +drug_exposure | drug_exposure_end_date | IN BOTH +drug_exposure | drug_exposure_end_datetime | IN BOTH +drug_exposure | verbatim_end_date | IN BOTH +drug_exposure | drug_type_concept_id | IN BOTH +drug_exposure | refills | IN BOTH +drug_exposure | quantity | IN BOTH +drug_exposure | days_supply | IN BOTH +drug_exposure | route_concept_id | IN BOTH +drug_exposure | provider_id | IN BOTH +drug_exposure | visit_occurrence_id | IN BOTH +drug_exposure | visit_detail_id | IN BOTH +drug_exposure | drug_source_concept_id | IN BOTH +drug_exposure | stop_reason | IN BOTH +drug_exposure | sig | IN BOTH +drug_exposure | lot_number | IN BOTH +drug_exposure | drug_source_value | IN BOTH +drug_exposure | route_source_value | IN BOTH +drug_exposure | dose_unit_source_value | IN BOTH +drug_strength | drug_concept_id | IN BOTH +drug_strength | ingredient_concept_id | IN BOTH +drug_strength | amount_value | IN BOTH +drug_strength | amount_unit_concept_id | IN BOTH +drug_strength | numerator_value | IN BOTH +drug_strength | numerator_unit_concept_id | IN BOTH +drug_strength | denominator_value | IN BOTH +drug_strength | denominator_unit_concept_id | IN BOTH +drug_strength | box_size | IN BOTH +drug_strength | valid_start_date | IN BOTH +drug_strength | valid_end_date | IN BOTH +drug_strength | invalid_reason | IN BOTH +episode | episode_id | MISSING FROM v6.0.1 +episode | person_id | MISSING FROM v6.0.1 +episode | episode_concept_id | MISSING FROM v6.0.1 +episode | episode_start_date | MISSING FROM v6.0.1 +episode | episode_start_datetime | MISSING FROM v6.0.1 +episode | episode_end_date | MISSING FROM v6.0.1 +episode | episode_end_datetime | MISSING FROM v6.0.1 +episode | episode_parent_id | MISSING FROM v6.0.1 +episode | episode_number | MISSING FROM v6.0.1 +episode | episode_object_concept_id | MISSING FROM v6.0.1 +episode | episode_type_concept_id | MISSING FROM v6.0.1 +episode | episode_source_value | MISSING FROM v6.0.1 +episode | episode_source_concept_id | MISSING FROM v6.0.1 +episode_event | episode_id | MISSING FROM v6.0.1 +episode_event | event_id | MISSING FROM v6.0.1 +episode_event | episode_event_field_concept_id | MISSING FROM v6.0.1 +fact_relationship | domain_concept_id_1 | IN BOTH +fact_relationship | fact_id_1 | IN BOTH +fact_relationship | domain_concept_id_2 | IN BOTH +fact_relationship | fact_id_2 | IN BOTH +fact_relationship | relationship_concept_id | IN BOTH +location | location_id | IN BOTH +location | address_1 | IN BOTH +location | address_2 | IN BOTH +location | city | IN BOTH +location | state | IN BOTH +location | zip | IN BOTH +location | county | IN BOTH +location | location_source_value | IN BOTH +location | latitude | IN BOTH +location | longitude | IN BOTH +location | country_concept_id | MISSING FROM v6.0.1 +location | country_source_value | MISSING FROM v6.0.1 +location_history | location_id | MISSING FROM v5.4.0 +location_history | relationship_type_concept_id | MISSING FROM v5.4.0 +location_history | domain_id | MISSING FROM v5.4.0 +location_history | entity_id | MISSING FROM v5.4.0 +location_history | start_date | MISSING FROM v5.4.0 +location_history | end_date | MISSING FROM v5.4.0 +measurement | measurement_id | IN BOTH +measurement | person_id | IN BOTH +measurement | measurement_concept_id | IN BOTH +measurement | measurement_date | IN BOTH +measurement | measurement_datetime | IN BOTH +measurement | measurement_time | IN BOTH +measurement | measurement_type_concept_id | IN BOTH +measurement | operator_concept_id | IN BOTH +measurement | value_as_number | IN BOTH +measurement | value_as_concept_id | IN BOTH +measurement | unit_concept_id | IN BOTH +measurement | range_low | IN BOTH +measurement | range_high | IN BOTH +measurement | provider_id | IN BOTH +measurement | visit_occurrence_id | IN BOTH +measurement | visit_detail_id | IN BOTH +measurement | measurement_source_concept_id | IN BOTH +measurement | measurement_source_value | IN BOTH +measurement | unit_source_value | IN BOTH +measurement | value_source_value | IN BOTH +measurement | unit_source_id | MISSING FROM v6.0.1 +measurement | measurement_event_id | MISSING FROM v6.0.1 +measurement | meas_event_field_concept_id | MISSING FROM v6.0.1 +metadata | metadata_concept_id | IN BOTH +metadata | metadata_type_concept_id | IN BOTH +metadata | value_as_concept_id | IN BOTH +metadata | metadata_date | IN BOTH +metadata | metadata_datetime | IN BOTH +metadata | name | IN BOTH +metadata | value_as_string | IN BOTH +metadata | metadata_id | MISSING FROM v6.0.1 +metadata | value_as_number | MISSING FROM v6.0.1 +note | note_id | IN BOTH +note | person_id | IN BOTH +note | note_date | IN BOTH +note | note_datetime | IN BOTH +note | note_type_concept_id | IN BOTH +note | note_class_concept_id | IN BOTH +note | encoding_concept_id | IN BOTH +note | language_concept_id | IN BOTH +note | provider_id | IN BOTH +note | visit_occurrence_id | IN BOTH +note | visit_detail_id | IN BOTH +note | note_title | IN BOTH +note | note_text | IN BOTH +note | note_source_value | IN BOTH +note | note_event_id | IN BOTH +note | note_event_field_concept_id | IN BOTH +note_nlp | note_nlp_id | IN BOTH +note_nlp | note_id | IN BOTH +note_nlp | section_concept_id | IN BOTH +note_nlp | note_nlp_concept_id | IN BOTH +note_nlp | note_nlp_source_concept_id | IN BOTH +note_nlp | nlp_date | IN BOTH +note_nlp | nlp_datetime | IN BOTH +note_nlp | snippet | IN BOTH +note_nlp | offset | IN BOTH +note_nlp | lexical_variant | IN BOTH +note_nlp | nlp_system | IN BOTH +note_nlp | term_exists | IN BOTH +note_nlp | term_temporal | IN BOTH +note_nlp | term_modifiers | IN BOTH +observation | observation_id | IN BOTH +observation | person_id | IN BOTH +observation | observation_concept_id | IN BOTH +observation | observation_date | IN BOTH +observation | observation_datetime | IN BOTH +observation | observation_type_concept_id | IN BOTH +observation | value_as_number | IN BOTH +observation | value_as_concept_id | IN BOTH +observation | qualifier_concept_id | IN BOTH +observation | unit_concept_id | IN BOTH +observation | provider_id | IN BOTH +observation | visit_occurrence_id | IN BOTH +observation | visit_detail_id | IN BOTH +observation | observation_source_concept_id | IN BOTH +observation | value_as_string | IN BOTH +observation | observation_source_value | IN BOTH +observation | unit_source_value | IN BOTH +observation | qualifier_source_value | IN BOTH +observation | observation_event_id | IN BOTH +observation | obs_event_field_concept_id | IN BOTH +observation | value_as_datetime | MISSING FROM v5.4.0 +observation | value_source_value | MISSING FROM v6.0.1 +observation_period | observation_period_id | IN BOTH +observation_period | person_id | IN BOTH +observation_period | observation_period_start_date | IN BOTH +observation_period | observation_period_end_date | IN BOTH +observation_period | period_type_concept_id | IN BOTH +payer_plan_period | payer_plan_period_id | IN BOTH +payer_plan_period | person_id | IN BOTH +payer_plan_period | payer_plan_period_start_date | IN BOTH +payer_plan_period | payer_plan_period_end_date | IN BOTH +payer_plan_period | payer_concept_id | IN BOTH +payer_plan_period | payer_source_concept_id | IN BOTH +payer_plan_period | plan_concept_id | IN BOTH +payer_plan_period | plan_source_concept_id | IN BOTH +payer_plan_period | sponsor_concept_id | IN BOTH +payer_plan_period | sponsor_source_concept_id | IN BOTH +payer_plan_period | stop_reason_concept_id | IN BOTH +payer_plan_period | stop_reason_source_concept_id | IN BOTH +payer_plan_period | payer_source_value | IN BOTH +payer_plan_period | plan_source_value | IN BOTH +payer_plan_period | sponsor_source_value | IN BOTH +payer_plan_period | family_source_value | IN BOTH +payer_plan_period | stop_reason_source_value | IN BOTH +payer_plan_period | contract_person_id | MISSING FROM v5.4.0 +payer_plan_period | contract_concept_id | MISSING FROM v5.4.0 +payer_plan_period | contract_source_value | MISSING FROM v5.4.0 +payer_plan_period | contract_source_concept_id | MISSING FROM v5.4.0 +person | person_id | IN BOTH +person | gender_concept_id | IN BOTH +person | year_of_birth | IN BOTH +person | month_of_birth | IN BOTH +person | day_of_birth | IN BOTH +person | birth_datetime | IN BOTH +person | race_concept_id | IN BOTH +person | ethnicity_concept_id | IN BOTH +person | location_id | IN BOTH +person | provider_id | IN BOTH +person | care_site_id | IN BOTH +person | gender_source_concept_id | IN BOTH +person | race_source_concept_id | IN BOTH +person | ethnicity_source_concept_id | IN BOTH +person | person_source_value | IN BOTH +person | gender_source_value | IN BOTH +person | race_source_value | IN BOTH +person | ethnicity_source_value | IN BOTH +person | death_datetime | MISSING FROM v5.4.0 +procedure_occurrence | procedure_occurrence_id | IN BOTH +procedure_occurrence | person_id | IN BOTH +procedure_occurrence | procedure_concept_id | IN BOTH +procedure_occurrence | procedure_date | IN BOTH +procedure_occurrence | procedure_datetime | IN BOTH +procedure_occurrence | procedure_type_concept_id | IN BOTH +procedure_occurrence | modifier_concept_id | IN BOTH +procedure_occurrence | quantity | IN BOTH +procedure_occurrence | provider_id | IN BOTH +procedure_occurrence | visit_occurrence_id | IN BOTH +procedure_occurrence | visit_detail_id | IN BOTH +procedure_occurrence | procedure_source_concept_id | IN BOTH +procedure_occurrence | procedure_source_value | IN BOTH +procedure_occurrence | modifier_source_value | IN BOTH +procedure_occurrence | procedure_end_date | MISSING FROM v6.0.1 +procedure_occurrence | procedure_end_datetime | MISSING FROM v6.0.1 +provider | provider_id | IN BOTH +provider | specialty_concept_id | IN BOTH +provider | care_site_id | IN BOTH +provider | year_of_birth | IN BOTH +provider | gender_concept_id | IN BOTH +provider | specialty_source_concept_id | IN BOTH +provider | gender_source_concept_id | IN BOTH +provider | provider_name | IN BOTH +provider | npi | IN BOTH +provider | dea | IN BOTH +provider | provider_source_value | IN BOTH +provider | specialty_source_value | IN BOTH +provider | gender_source_value | IN BOTH +relationship | relationship_concept_id | IN BOTH +relationship | relationship_id | IN BOTH +relationship | relationship_name | IN BOTH +relationship | is_hierarchical | IN BOTH +relationship | defines_ancestry | IN BOTH +relationship | reverse_relationship_id | IN BOTH +source_to_concept_map | source_concept_id | IN BOTH +source_to_concept_map | target_concept_id | IN BOTH +source_to_concept_map | valid_start_date | IN BOTH +source_to_concept_map | valid_end_date | IN BOTH +source_to_concept_map | source_code | IN BOTH +source_to_concept_map | source_vocabulary_id | IN BOTH +source_to_concept_map | source_code_description | IN BOTH +source_to_concept_map | target_vocabulary_id | IN BOTH +source_to_concept_map | invalid_reason | IN BOTH +specimen | specimen_id | IN BOTH +specimen | person_id | IN BOTH +specimen | specimen_concept_id | IN BOTH +specimen | specimen_type_concept_id | IN BOTH +specimen | specimen_date | IN BOTH +specimen | specimen_datetime | IN BOTH +specimen | quantity | IN BOTH +specimen | unit_concept_id | IN BOTH +specimen | anatomic_site_concept_id | IN BOTH +specimen | disease_status_concept_id | IN BOTH +specimen | specimen_source_id | IN BOTH +specimen | specimen_source_value | IN BOTH +specimen | unit_source_value | IN BOTH +specimen | anatomic_site_source_value | IN BOTH +specimen | disease_status_source_value | IN BOTH +survey_conduct | survey_conduct_id | MISSING FROM v5.4.0 +survey_conduct | person_id | MISSING FROM v5.4.0 +survey_conduct | survey_concept_id | MISSING FROM v5.4.0 +survey_conduct | survey_start_date | MISSING FROM v5.4.0 +survey_conduct | survey_start_datetime | MISSING FROM v5.4.0 +survey_conduct | survey_end_date | MISSING FROM v5.4.0 +survey_conduct | survey_end_datetime | MISSING FROM v5.4.0 +survey_conduct | provider_id | MISSING FROM v5.4.0 +survey_conduct | assisted_concept_id | MISSING FROM v5.4.0 +survey_conduct | respondent_type_concept_id | MISSING FROM v5.4.0 +survey_conduct | timing_concept_id | MISSING FROM v5.4.0 +survey_conduct | collection_method_concept_id | MISSING FROM v5.4.0 +survey_conduct | assisted_source_value | MISSING FROM v5.4.0 +survey_conduct | respondent_type_source_value | MISSING FROM v5.4.0 +survey_conduct | timing_source_value | MISSING FROM v5.4.0 +survey_conduct | collection_method_source_value | MISSING FROM v5.4.0 +survey_conduct | survey_source_value | MISSING FROM v5.4.0 +survey_conduct | survey_source_concept_id | MISSING FROM v5.4.0 +survey_conduct | survey_source_identifier | MISSING FROM v5.4.0 +survey_conduct | validated_survey_concept_id | MISSING FROM v5.4.0 +survey_conduct | validated_survey_source_value | MISSING FROM v5.4.0 +survey_conduct | survey_version_number | MISSING FROM v5.4.0 +survey_conduct | visit_occurrence_id | MISSING FROM v5.4.0 +survey_conduct | response_visit_occurrence_id | MISSING FROM v5.4.0 +visit_detail | visit_detail_id | IN BOTH +visit_detail | person_id | IN BOTH +visit_detail | visit_detail_concept_id | IN BOTH +visit_detail | visit_detail_start_date | IN BOTH +visit_detail | visit_detail_start_datetime | IN BOTH +visit_detail | visit_detail_end_date | IN BOTH +visit_detail | visit_detail_end_datetime | IN BOTH +visit_detail | visit_detail_type_concept_id | IN BOTH +visit_detail | provider_id | IN BOTH +visit_detail | care_site_id | IN BOTH +visit_detail | preceding_visit_detail_id | IN BOTH +visit_detail | visit_detail_source_concept_id | IN BOTH +visit_detail | visit_occurrence_id | IN BOTH +visit_detail | visit_detail_source_value | IN BOTH +visit_detail | admitted_from_concept_id | IN BOTH +visit_detail | admitted_from_source_value | IN BOTH +visit_detail | discharge_to_source_value | MISSING FROM v5.4.0 +visit_detail | discharge_to_concept_id | MISSING FROM v5.4.0 +visit_detail | visit_detail_parent_id | MISSING FROM v5.4.0 +visit_detail | discharged_to_concept_id | MISSING FROM v6.0.1 +visit_detail | discharged_to_source_value | MISSING FROM v6.0.1 +visit_detail | parent_visit_detail_id | MISSING FROM v6.0.1 +visit_occurrence | visit_occurrence_id | IN BOTH +visit_occurrence | person_id | IN BOTH +visit_occurrence | visit_concept_id | IN BOTH +visit_occurrence | visit_start_date | IN BOTH +visit_occurrence | visit_start_datetime | IN BOTH +visit_occurrence | visit_end_date | IN BOTH +visit_occurrence | visit_end_datetime | IN BOTH +visit_occurrence | visit_type_concept_id | IN BOTH +visit_occurrence | provider_id | IN BOTH +visit_occurrence | care_site_id | IN BOTH +visit_occurrence | visit_source_concept_id | IN BOTH +visit_occurrence | preceding_visit_occurrence_id | IN BOTH +visit_occurrence | visit_source_value | IN BOTH +visit_occurrence | admitted_from_concept_id | IN BOTH +visit_occurrence | admitted_from_source_value | IN BOTH +visit_occurrence | discharge_to_concept_id | MISSING FROM v5.4.0 +visit_occurrence | discharge_to_source_value | MISSING FROM v5.4.0 +visit_occurrence | discharged_to_concept_id | MISSING FROM v6.0.1 +visit_occurrence | discharged_to_source_value | MISSING FROM v6.0.1 +vocabulary | vocabulary_id | IN BOTH +vocabulary | vocabulary_name | IN BOTH +vocabulary | vocabulary_reference | IN BOTH +vocabulary | vocabulary_version | IN BOTH +vocabulary | vocabulary_concept_id | IN BOTH diff --git a/extras/v60_v54_conversion/redshift_v60_v54_migration.sql b/extras/v60_v54_conversion/redshift_v60_v54_migration.sql new file mode 100644 index 0000000..08bf92a --- /dev/null +++ b/extras/v60_v54_conversion/redshift_v60_v54_migration.sql @@ -0,0 +1,134 @@ + +-- DEATH +CREATE TABLE DEATH ( person_id integer NOT NULL, + death_date date NOT NULL, + death_datetime TIMESTAMP NULL, + death_type_concept_id integer NULL, + cause_concept_id integer NULL, + cause_source_value varchar(50) NULL, + cause_source_concept_id integer NULL ) +DISTKEY(person_id); + +-- EPISODE +CREATE TABLE EPISODE (episode_id bigint NOT NULL, + person_id bigint NOT NULL, + episode_concept_id integer NOT NULL, + episode_start_date date NOT NULL, + episode_start_datetime TIMESTAMP NULL, + episode_end_date date NULL, + episode_end_datetime TIMESTAMP NULL, + episode_parent_id bigint NULL, + episode_number integer NULL, + episode_object_concept_id integer NOT NULL, + episode_type_concept_id integer NOT NULL, + episode_source_value varchar(50) NULL, + episode_source_concept_id integer NULL ) +DISTKEY(person_id); + +-- EPISODE_EVENT +CREATE TABLE EPISODE_EVENT (episode_id bigint NOT NULL, + event_id bigint NOT NULL, + episode_event_field_concept_id integer NOT NULL ) +DISTSTYLE ALL; + +-- PERSON +alter table person drop column death_datetime; + + +-- VISIT_OCCURRENCE +alter table visit_occurrence rename column discharge_to_concept_id to discharged_to_concept_id; +alter table visit_occurrence rename column discharge_to_source_value to discharged_to_source_value; + + +-- VISIT_DETAIL +alter table visit_detail rename column discharge_to_concept_id to discharged_to_concept_id; +alter table visit_detail rename column discharge_to_source_value to discharged_to_source_value; +alter table visit_detail rename column visit_detail_parent_id to parent_visit_detail_id; + +-- PROCEDURE_OCCURRENCE +alter table procedure_occurrence add column procedure_end_date date; +alter table procedure_occurrence add column procedure_end_datetime timestamp; + + +-- DEVICE_EXPOSURE +alter table device_exposure add column production_id varchar(255); +alter table device_exposure add column unit_concept_id integer; +alter table device_exposure add column unit_source_value varchar(50); +alter table device_exposure add column unit_source_concept_id integer; + + +-- MEASUREMENT +alter table measurement add column unit_source_id integer; +alter table measurement add column measurement_event_id bigint; +alter table measurement add column meas_event_field_concept_id integer; + + +-- OBSERVATION +alter table observation add column value_source_value varchar(50); +alter table observation drop column value_as_datetime; + +-- LOCATION +alter location add column country_concept_id integer; +alter location add column country_source_value varchar(80); + + +-- PAYER_PLAN_PERIOD +alter table payer_plan_period drop column contract_person_id; +alter table payer_plan_period drop column contract_concept_id; +alter table payer_plan_period drop column contract_source_value; +alter table payer_plan_period drop column contract_source_concept_id; + +-- COST +alter table cost drop column person_id; +alter table cost drop column cost_event_field_concept_id; +alter table cost drop column cost_concept_id; +alter table cost drop column cost_source_concept_id; +alter table cost drop column cost_source_value; +alter table cost drop column cost; +alter table cost drop column incurred_date; +alter table cost drop column billed_date; +alter table cost drop column paid_date; +alter table cost drop column revenue_code_source_value; +alter cost add column total_charge float; +alter cost add column total_cost float; +alter cost add column total_paid float; +alter cost add column paid_by_payer float; +alter cost add column paid_by_patient float; +alter cost add column paid_by_primary float; +alter cost add column paid_patient_copay float; +alter cost add column paid_patient_coinsurance float; +alter cost add column paid_patient_deductible float; +alter cost add column paid_ingredient_cost float; +alter cost add column paid_dispensing_fee float; +alter cost add column amount_allowed float; +alter cost add column cost_domain_id varchar(20); +alter cost add column revenue_code_source_value varchar(50); + + +-- DRUG_ERA +alter table drug_era rename column drug_era_start_datetime to drug_era_start_date; +alter table drug_era rename column drug_era_end_datetime to drug_era_end_date; +alter table drug_era alter column drug_era_start_date date; +alter table drug_era alter column drug_era_end_date date; + + +-- DOSE_ERA +alter table dose_era rename column dose_era_start_datetime to dose_era_start_date; +alter table dose_era rename column dose_era_end_datetime to dose_era_end_date; +alter table dose_era alter column dose_era_start_date date; +alter table dose_era alter column dose_era_end_date date; + +-- CONDITION_ERA +alter table condition_era rename column condition_era_start_datetime to condition_era_start_date; +alter table condition_era rename column condition_era_end_datetime to condition_era_end_date; +alter table condition_era alter column condition_era_start_date date; +alter table condition_era alter column condition_era_end_date date; + + +-- METADATA +alter table metadata add column metadata_id integer; +alter table metadata add column value_as_number float; + + +-- CDM_SOURCE +alter table cdm_source add column cdm_version_concept_id integer; From 2c61a520fb9a23e0a30f86798bca7acbfbc7515b Mon Sep 17 00:00:00 2001 From: AnthonyMolinaro <31700317+AnthonyMolinaro@users.noreply.github.com> Date: Fri, 4 Mar 2022 13:00:26 -0500 Subject: [PATCH 03/39] Update redshift_migration.sql Typo in measurement - column should be unit_source_concept_id, not unit_source_id --- extras/v53_v54_conversion/redshift_migration.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/v53_v54_conversion/redshift_migration.sql b/extras/v53_v54_conversion/redshift_migration.sql index 3b757fe..4fc8724 100644 --- a/extras/v53_v54_conversion/redshift_migration.sql +++ b/extras/v53_v54_conversion/redshift_migration.sql @@ -53,7 +53,7 @@ alter table @cdmDatabaseSchema.device_exposure add column unit_source_concept_id -- + Measurement_event_id -- + Meas_event_field_concept_id -alter table @cdmDatabaseSchema.measurement add column unit_source_id integer default null; +alter table @cdmDatabaseSchema.measurement add column unit_source_concept_id integer default null; alter table @cdmDatabaseSchema.measurement add column measurement_event_id bigint default null; alter table @cdmDatabaseSchema.measurement add column meas_event_field_concept_id integer default null; From bdb5789d4a52cfd5b1a19ee50c802cf96f517dc3 Mon Sep 17 00:00:00 2001 From: AnthonyMolinaro <31700317+AnthonyMolinaro@users.noreply.github.com> Date: Fri, 4 Mar 2022 13:05:50 -0500 Subject: [PATCH 04/39] Update sqlserver_migration.sql --- extras/v53_v54_conversion/sqlserver_migration.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/v53_v54_conversion/sqlserver_migration.sql b/extras/v53_v54_conversion/sqlserver_migration.sql index f692992..f87782b 100644 --- a/extras/v53_v54_conversion/sqlserver_migration.sql +++ b/extras/v53_v54_conversion/sqlserver_migration.sql @@ -56,7 +56,7 @@ alter table @cdmDatabaseSchema.device_exposure add unit_source_concept_id int nu -- + Measurement_event_id -- + Meas_event_field_concept_id -alter table @cdmDatabaseSchema.measurement add unit_source_id int null; +alter table @cdmDatabaseSchema.measurement add unit_source_concept_id int null; alter table @cdmDatabaseSchema.measurement add measurement_event_id bigint null; alter table @cdmDatabaseSchema.measurement add meas_event_field_concept_id int null; From e10628d954b44dd722b2f81c8ef243627fda202d Mon Sep 17 00:00:00 2001 From: AnthonyMolinaro <31700317+AnthonyMolinaro@users.noreply.github.com> Date: Fri, 4 Mar 2022 13:07:10 -0500 Subject: [PATCH 05/39] Update postgresql_migration.sql --- extras/v53_v54_conversion/postgresql_migration.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/v53_v54_conversion/postgresql_migration.sql b/extras/v53_v54_conversion/postgresql_migration.sql index 9e8e202..8d37313 100644 --- a/extras/v53_v54_conversion/postgresql_migration.sql +++ b/extras/v53_v54_conversion/postgresql_migration.sql @@ -52,7 +52,7 @@ alter table @cdmDatabaseSchema.device_exposure add column unit_source_concept_id -- + Measurement_event_id -- + Meas_event_field_concept_id -alter table @cdmDatabaseSchema.measurement add column unit_source_id integer default null; +alter table @cdmDatabaseSchema.measurement add column unit_source_concept_id integer default null; alter table @cdmDatabaseSchema.measurement add column measurement_event_id bigint default null; alter table @cdmDatabaseSchema.measurement add column meas_event_field_concept_id integer default null; From 65166e4bd7204b9fb40356b89298e3b66781da2c Mon Sep 17 00:00:00 2001 From: AnthonyMolinaro <31700317+AnthonyMolinaro@users.noreply.github.com> Date: Fri, 4 Mar 2022 13:07:29 -0500 Subject: [PATCH 06/39] Update oracle_migration.sql --- extras/v53_v54_conversion/oracle_migration.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/v53_v54_conversion/oracle_migration.sql b/extras/v53_v54_conversion/oracle_migration.sql index a195176..d03ee3e 100644 --- a/extras/v53_v54_conversion/oracle_migration.sql +++ b/extras/v53_v54_conversion/oracle_migration.sql @@ -54,7 +54,7 @@ alter table @cdmDatabaseSchema.device_exposure add (unit_source_concept_id numbe -- + Measurement_event_id -- + Meas_event_field_concept_id -alter table @cdmDatabaseSchema.measurement add (unit_source_id number default null); +alter table @cdmDatabaseSchema.measurement add (unit_source_concept_id number default null); alter table @cdmDatabaseSchema.measurement add (measurement_event_id number default null); alter table @cdmDatabaseSchema.measurement add (meas_event_field_concept_id number default null); From 074bd288f8cb28b4f9b888e9364681ca34e6d047 Mon Sep 17 00:00:00 2001 From: AnthonyMolinaro <31700317+AnthonyMolinaro@users.noreply.github.com> Date: Fri, 4 Mar 2022 13:07:48 -0500 Subject: [PATCH 07/39] Update netezza_migration.sql --- extras/v53_v54_conversion/netezza_migration.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/v53_v54_conversion/netezza_migration.sql b/extras/v53_v54_conversion/netezza_migration.sql index 1af4181..1aa511b 100644 --- a/extras/v53_v54_conversion/netezza_migration.sql +++ b/extras/v53_v54_conversion/netezza_migration.sql @@ -53,7 +53,7 @@ alter table @cdmDatabaseSchema.device_exposure add column unit_source_concept_id -- + Measurement_event_id -- + Meas_event_field_concept_id -alter table @cdmDatabaseSchema.measurement add column unit_source_id integer default null; +alter table @cdmDatabaseSchema.measurement add column unit_source_concept_id integer default null; alter table @cdmDatabaseSchema.measurement add column measurement_event_id bigint null; alter table @cdmDatabaseSchema.measurement add column meas_event_field_concept_id integer null; From 4ac3d61c6fcf10e2161438cac1699a6d645e5543 Mon Sep 17 00:00:00 2001 From: AnthonyMolinaro <31700317+AnthonyMolinaro@users.noreply.github.com> Date: Fri, 4 Mar 2022 13:08:30 -0500 Subject: [PATCH 08/39] Update impala_migration.sql --- extras/v53_v54_conversion/impala_migration.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/v53_v54_conversion/impala_migration.sql b/extras/v53_v54_conversion/impala_migration.sql index f7fc26e..b119148 100644 --- a/extras/v53_v54_conversion/impala_migration.sql +++ b/extras/v53_v54_conversion/impala_migration.sql @@ -52,7 +52,7 @@ alter table @cdmDatabaseSchema.device_exposure add columns (unit_source_concept_ -- + Measurement_event_id -- + Meas_event_field_concept_id -alter table @cdmDatabaseSchema.measurement add columns (unit_source_id int); +alter table @cdmDatabaseSchema.measurement add columns (unit_source_concept_id int); alter table @cdmDatabaseSchema.measurement add columns (measurement_event_id int); alter table @cdmDatabaseSchema.measurement add columns (meas_event_field_concept_id int); From c4ab6119819f7c540a6edcf224914dcfcd99a73d Mon Sep 17 00:00:00 2001 From: AnthonyMolinaro <31700317+AnthonyMolinaro@users.noreply.github.com> Date: Fri, 4 Mar 2022 13:08:46 -0500 Subject: [PATCH 09/39] Update bigquery_migration.sql --- extras/v53_v54_conversion/bigquery_migration.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/v53_v54_conversion/bigquery_migration.sql b/extras/v53_v54_conversion/bigquery_migration.sql index 757629c..8acec21 100644 --- a/extras/v53_v54_conversion/bigquery_migration.sql +++ b/extras/v53_v54_conversion/bigquery_migration.sql @@ -65,7 +65,7 @@ alter table @cdmDatabaseSchema.device_exposure add column unit_source_concept_id -- + Measurement_event_id -- + Meas_event_field_concept_id -alter table @cdmDatabaseSchema.measurement add column unit_source_id int64; +alter table @cdmDatabaseSchema.measurement add column unit_source_concept_id int64; alter table @cdmDatabaseSchema.measurement add column measurement_event_id int64; alter table @cdmDatabaseSchema.measurement add column meas_event_field_concept_id int64; From 759270d000ab5f0c2d36af8d336adbf88833efc2 Mon Sep 17 00:00:00 2001 From: Maxim Moinat Date: Wed, 30 Nov 2022 16:08:19 +0100 Subject: [PATCH 10/39] create ER diagram from OMOP CDM specification --- extras/OMOP_CDMv5.4_ER_Diagram.mmd | 605 +++++++++++++++++++++++++++++ extras/createERDiagram.R | 55 +++ 2 files changed, 660 insertions(+) create mode 100644 extras/OMOP_CDMv5.4_ER_Diagram.mmd create mode 100644 extras/createERDiagram.R diff --git a/extras/OMOP_CDMv5.4_ER_Diagram.mmd b/extras/OMOP_CDMv5.4_ER_Diagram.mmd new file mode 100644 index 0000000..bd789f3 --- /dev/null +++ b/extras/OMOP_CDMv5.4_ER_Diagram.mmd @@ -0,0 +1,605 @@ +erDiagram + PERSON { + person_id integer + gender_concept_id integer + year_of_birth integer + month_of_birth integer + day_of_birth integer + birth_datetime datetime + race_concept_id integer + ethnicity_concept_id integer + location_id integer + provider_id integer + care_site_id integer + person_source_value varchar + gender_source_value varchar + gender_source_concept_id integer + race_source_value varchar + race_source_concept_id integer + ethnicity_source_value varchar + ethnicity_source_concept_id integer + } + OBSERVATION_PERIOD { + observation_period_id integer + person_id integer + observation_period_start_date date + observation_period_end_date date + period_type_concept_id integer + } + VISIT_OCCURRENCE { + visit_occurrence_id integer + person_id integer + visit_concept_id integer + visit_start_date date + visit_start_datetime datetime + visit_end_date date + visit_end_datetime datetime + visit_type_concept_id Integer + provider_id integer + care_site_id integer + visit_source_value varchar + visit_source_concept_id integer + admitted_from_concept_id integer + admitted_from_source_value varchar + discharged_to_concept_id integer + discharged_to_source_value varchar + preceding_visit_occurrence_id integer + } + VISIT_DETAIL { + visit_detail_id integer + person_id integer + visit_detail_concept_id integer + visit_detail_start_date date + visit_detail_start_datetime datetime + visit_detail_end_date date + visit_detail_end_datetime datetime + visit_detail_type_concept_id integer + provider_id integer + care_site_id integer + visit_detail_source_value varchar + visit_detail_source_concept_id Integer + admitted_from_concept_id Integer + admitted_from_source_value varchar + discharged_to_source_value varchar + discharged_to_concept_id integer + preceding_visit_detail_id integer + parent_visit_detail_id integer + visit_occurrence_id integer + } + CONDITION_OCCURRENCE { + condition_occurrence_id integer + person_id integer + condition_concept_id integer + condition_start_date date + condition_start_datetime datetime + condition_end_date date + condition_end_datetime datetime + condition_type_concept_id integer + condition_status_concept_id integer + stop_reason varchar + provider_id integer + visit_occurrence_id integer + visit_detail_id integer + condition_source_value varchar + condition_source_concept_id integer + condition_status_source_value varchar + } + DRUG_EXPOSURE { + drug_exposure_id integer + person_id integer + drug_concept_id integer + drug_exposure_start_date date + drug_exposure_start_datetime datetime + drug_exposure_end_date date + drug_exposure_end_datetime datetime + verbatim_end_date date + drug_type_concept_id integer + stop_reason varchar + refills integer + quantity float + days_supply integer + sig varchar + route_concept_id integer + lot_number varchar + provider_id integer + visit_occurrence_id integer + visit_detail_id integer + drug_source_value varchar + drug_source_concept_id integer + route_source_value varchar + dose_unit_source_value varchar + } + PROCEDURE_OCCURRENCE { + procedure_occurrence_id integer + person_id integer + procedure_concept_id integer + procedure_date date + procedure_datetime datetime + procedure_end_date date + procedure_end_datetime datetime + procedure_type_concept_id integer + modifier_concept_id integer + quantity integer + provider_id integer + visit_occurrence_id integer + visit_detail_id integer + procedure_source_value varchar + procedure_source_concept_id integer + modifier_source_value varchar + } + DEVICE_EXPOSURE { + device_exposure_id integer + person_id integer + device_concept_id integer + device_exposure_start_date date + device_exposure_start_datetime datetime + device_exposure_end_date date + device_exposure_end_datetime datetime + device_type_concept_id integer + unique_device_id varchar + production_id varchar + quantity integer + provider_id integer + visit_occurrence_id integer + visit_detail_id integer + device_source_value varchar + device_source_concept_id integer + unit_concept_id integer + unit_source_value varchar + unit_source_concept_id integer + } + MEASUREMENT { + measurement_id integer + person_id integer + measurement_concept_id integer + measurement_date date + measurement_datetime datetime + measurement_time varchar + measurement_type_concept_id integer + operator_concept_id integer + value_as_number float + value_as_concept_id integer + unit_concept_id integer + range_low float + range_high float + provider_id integer + visit_occurrence_id integer + visit_detail_id integer + measurement_source_value varchar + measurement_source_concept_id integer + unit_source_value varchar + unit_source_concept_id integer + value_source_value varchar + measurement_event_id integer + meas_event_field_concept_id integer + } + OBSERVATION { + observation_id integer + person_id integer + observation_concept_id integer + observation_date date + observation_datetime datetime + observation_type_concept_id integer + value_as_number float + value_as_string varchar + value_as_concept_id Integer + qualifier_concept_id integer + unit_concept_id integer + provider_id integer + visit_occurrence_id integer + visit_detail_id integer + observation_source_value varchar + observation_source_concept_id integer + unit_source_value varchar + qualifier_source_value varchar + value_source_value varchar + observation_event_id integer + obs_event_field_concept_id integer + } + DEATH { + person_id integer + death_date date + death_datetime datetime + death_type_concept_id integer + cause_concept_id integer + cause_source_value varchar + cause_source_concept_id integer + } + NOTE { + note_id integer + person_id integer + note_date date + note_datetime datetime + note_type_concept_id integer + note_class_concept_id integer + note_title varchar + note_text varchar + encoding_concept_id integer + language_concept_id integer + provider_id integer + visit_occurrence_id integer + visit_detail_id integer + note_source_value varchar + note_event_id integer + note_event_field_concept_id integer + } + NOTE_NLP { + note_nlp_id integer + note_id integer + section_concept_id integer + snippet varchar + offset varchar + lexical_variant varchar + note_nlp_concept_id integer + note_nlp_source_concept_id integer + nlp_system varchar + nlp_date date + nlp_datetime datetime + term_exists varchar + term_temporal varchar + term_modifiers varchar + } + SPECIMEN { + specimen_id integer + person_id integer + specimen_concept_id integer + specimen_type_concept_id integer + specimen_date date + specimen_datetime datetime + quantity float + unit_concept_id integer + anatomic_site_concept_id integer + disease_status_concept_id integer + specimen_source_id varchar + specimen_source_value varchar + unit_source_value varchar + anatomic_site_source_value varchar + disease_status_source_value varchar + } + FACT_RELATIONSHIP { + domain_concept_id_1 integer + fact_id_1 integer + domain_concept_id_2 integer + fact_id_2 integer + relationship_concept_id integer + } + LOCATION { + location_id integer + address_1 varchar + address_2 varchar + city varchar + state varchar + zip varchar + county varchar + location_source_value varchar + country_concept_id integer + country_source_value varchar + latitude float + longitude float + } + CARE_SITE { + care_site_id integer + care_site_name varchar + place_of_service_concept_id integer + location_id integer + care_site_source_value varchar + place_of_service_source_value varchar + } + PROVIDER { + provider_id integer + provider_name varchar + npi varchar + dea varchar + specialty_concept_id integer + care_site_id integer + year_of_birth integer + gender_concept_id integer + provider_source_value varchar + specialty_source_value varchar + specialty_source_concept_id integer + gender_source_value varchar + gender_source_concept_id integer + } + PAYER_PLAN_PERIOD { + payer_plan_period_id integer + person_id integer + payer_plan_period_start_date date + payer_plan_period_end_date date + payer_concept_id integer + payer_source_value varchar + payer_source_concept_id integer + plan_concept_id integer + plan_source_value varchar + plan_source_concept_id integer + sponsor_concept_id integer + sponsor_source_value varchar + sponsor_source_concept_id integer + family_source_value varchar + stop_reason_concept_id integer + stop_reason_source_value varchar + stop_reason_source_concept_id integer + } + COST { + cost_id integer + cost_event_id integer + cost_domain_id varchar + cost_type_concept_id integer + currency_concept_id integer + total_charge float + total_cost float + total_paid float + paid_by_payer float + paid_by_patient float + paid_patient_copay float + paid_patient_coinsurance float + paid_patient_deductible float + paid_by_primary float + paid_ingredient_cost float + paid_dispensing_fee float + payer_plan_period_id integer + amount_allowed float + revenue_code_concept_id integer + revenue_code_source_value varchar + drg_concept_id integer + drg_source_value varchar + } + DRUG_ERA { + drug_era_id integer + person_id integer + drug_concept_id integer + drug_era_start_date date + drug_era_end_date date + drug_exposure_count integer + gap_days integer + } + DOSE_ERA { + dose_era_id integer + person_id integer + drug_concept_id integer + unit_concept_id integer + dose_value float + dose_era_start_date date + dose_era_end_date date + } + CONDITION_ERA { + condition_era_id integer + person_id integer + condition_concept_id integer + condition_era_start_date date + condition_era_end_date date + condition_occurrence_count integer + } + EPISODE { + episode_id integer + person_id integer + episode_concept_id integer + episode_start_date date + episode_start_datetime datetime + episode_end_date date + episode_end_datetime datetime + episode_parent_id integer + episode_number integer + episode_object_concept_id integer + episode_type_concept_id integer + episode_source_value varchar + episode_source_concept_id integer + } + EPISODE_EVENT { + episode_id integer + event_id integer + episode_event_field_concept_id integer + } + METADATA { + metadata_id integer + metadata_concept_id integer + metadata_type_concept_id integer + name varchar + value_as_string varchar + value_as_concept_id integer + value_as_number float + metadata_date date + metadata_datetime datetime + } + CDM_SOURCE { + cdm_source_name varchar + cdm_source_abbreviation varchar + cdm_holder varchar + source_description varchar + source_documentation_reference varchar + cdm_etl_reference varchar + source_release_date date + cdm_release_date date + cdm_version varchar + cdm_version_concept_id integer + vocabulary_version varchar + } + CONCEPT { + concept_id integer + concept_name varchar + domain_id varchar + vocabulary_id varchar + concept_class_id varchar + standard_concept varchar + concept_code varchar + valid_start_date date + valid_end_date date + invalid_reason varchar + } + VOCABULARY { + vocabulary_id varchar + vocabulary_name varchar + vocabulary_reference varchar + vocabulary_version varchar + vocabulary_concept_id integer + } + DOMAIN { + domain_id varchar + domain_name varchar + domain_concept_id integer + } + CONCEPT_CLASS { + concept_class_id varchar + concept_class_name varchar + concept_class_concept_id integer + } + CONCEPT_RELATIONSHIP { + concept_id_1 integer + concept_id_2 integer + relationship_id varchar + valid_start_date date + valid_end_date date + invalid_reason varchar + } + RELATIONSHIP { + relationship_id varchar + relationship_name varchar + is_hierarchical varchar + defines_ancestry varchar + reverse_relationship_id varchar + relationship_concept_id integer + } + CONCEPT_SYNONYM { + concept_id integer + concept_synonym_name varchar + language_concept_id integer + } + CONCEPT_ANCESTOR { + ancestor_concept_id integer + descendant_concept_id integer + min_levels_of_separation integer + max_levels_of_separation integer + } + SOURCE_TO_CONCEPT_MAP { + source_code varchar + source_concept_id integer + source_vocabulary_id varchar + source_code_description varchar + target_concept_id integer + target_vocabulary_id varchar + valid_start_date date + valid_end_date date + invalid_reason varchar + } + DRUG_STRENGTH { + drug_concept_id integer + ingredient_concept_id integer + amount_value float + amount_unit_concept_id integer + numerator_value float + numerator_unit_concept_id integer + denominator_value float + denominator_unit_concept_id integer + box_size integer + valid_start_date date + valid_end_date date + invalid_reason varchar + } + COHORT { + cohort_definition_id integer + subject_id integer + cohort_start_date date + cohort_end_date date + } + COHORT_DEFINITION { + cohort_definition_id integer + cohort_definition_name varchar + cohort_definition_description varchar + definition_type_concept_id integer + cohort_definition_syntax varchar + subject_concept_id integer + cohort_initiation_date date + } + PERSON ||--o{ CONCEPT : "" + PERSON ||--o{ LOCATION : "" + PERSON ||--o{ PROVIDER : "" + PERSON ||--o{ CARE_SITE : "" + OBSERVATION_PERIOD ||--o{ PERSON : "" + OBSERVATION_PERIOD ||--o{ CONCEPT : "" + VISIT_OCCURRENCE ||--o{ PERSON : "" + VISIT_OCCURRENCE ||--o{ CONCEPT : "" + VISIT_OCCURRENCE ||--o{ PROVIDER : "" + VISIT_OCCURRENCE ||--o{ CARE_SITE : "" + VISIT_OCCURRENCE ||--o{ VISIT_OCCURRENCE : "" + VISIT_DETAIL ||--o{ PERSON : "" + VISIT_DETAIL ||--o{ CONCEPT : "" + VISIT_DETAIL ||--o{ PROVIDER : "" + VISIT_DETAIL ||--o{ CARE_SITE : "" + VISIT_DETAIL ||--o{ VISIT_DETAIL : "" + VISIT_DETAIL ||--o{ VISIT_OCCURRENCE : "" + CONDITION_OCCURRENCE ||--o{ PERSON : "" + CONDITION_OCCURRENCE ||--o{ CONCEPT : "" + CONDITION_OCCURRENCE ||--o{ PROVIDER : "" + CONDITION_OCCURRENCE ||--o{ VISIT_OCCURRENCE : "" + CONDITION_OCCURRENCE ||--o{ VISIT_DETAIL : "" + DRUG_EXPOSURE ||--o{ PERSON : "" + DRUG_EXPOSURE ||--o{ CONCEPT : "" + DRUG_EXPOSURE ||--o{ PROVIDER : "" + DRUG_EXPOSURE ||--o{ VISIT_OCCURRENCE : "" + DRUG_EXPOSURE ||--o{ VISIT_DETAIL : "" + PROCEDURE_OCCURRENCE ||--o{ PERSON : "" + PROCEDURE_OCCURRENCE ||--o{ CONCEPT : "" + PROCEDURE_OCCURRENCE ||--o{ PROVIDER : "" + PROCEDURE_OCCURRENCE ||--o{ VISIT_OCCURRENCE : "" + PROCEDURE_OCCURRENCE ||--o{ VISIT_DETAIL : "" + DEVICE_EXPOSURE ||--o{ PERSON : "" + DEVICE_EXPOSURE ||--o{ CONCEPT : "" + DEVICE_EXPOSURE ||--o{ PROVIDER : "" + DEVICE_EXPOSURE ||--o{ VISIT_OCCURRENCE : "" + DEVICE_EXPOSURE ||--o{ VISIT_DETAIL : "" + MEASUREMENT ||--o{ PERSON : "" + MEASUREMENT ||--o{ CONCEPT : "" + MEASUREMENT ||--o{ PROVIDER : "" + MEASUREMENT ||--o{ VISIT_OCCURRENCE : "" + MEASUREMENT ||--o{ VISIT_DETAIL : "" + OBSERVATION ||--o{ PERSON : "" + OBSERVATION ||--o{ CONCEPT : "" + OBSERVATION ||--o{ PROVIDER : "" + OBSERVATION ||--o{ VISIT_OCCURRENCE : "" + OBSERVATION ||--o{ VISIT_DETAIL : "" + DEATH ||--o{ PERSON : "" + DEATH ||--o{ CONCEPT : "" + NOTE ||--o{ PERSON : "" + NOTE ||--o{ CONCEPT : "" + NOTE ||--o{ PROVIDER : "" + NOTE ||--o{ VISIT_OCCURRENCE : "" + NOTE ||--o{ VISIT_DETAIL : "" + NOTE_NLP ||--o{ CONCEPT : "" + SPECIMEN ||--o{ PERSON : "" + SPECIMEN ||--o{ CONCEPT : "" + FACT_RELATIONSHIP ||--o{ CONCEPT : "" + LOCATION ||--o{ CONCEPT : "" + CARE_SITE ||--o{ CONCEPT : "" + CARE_SITE ||--o{ LOCATION : "" + PROVIDER ||--o{ CONCEPT : "" + PROVIDER ||--o{ CARE_SITE : "" + PAYER_PLAN_PERIOD ||--o{ PERSON : "" + PAYER_PLAN_PERIOD ||--o{ CONCEPT : "" + COST ||--o{ DOMAIN : "" + COST ||--o{ CONCEPT : "" + DRUG_ERA ||--o{ PERSON : "" + DRUG_ERA ||--o{ CONCEPT : "" + DOSE_ERA ||--o{ PERSON : "" + DOSE_ERA ||--o{ CONCEPT : "" + CONDITION_ERA ||--o{ PERSON : "" + CONDITION_ERA ||--o{ CONCEPT : "" + EPISODE ||--o{ PERSON : "" + EPISODE ||--o{ CONCEPT : "" + EPISODE_EVENT ||--o{ EPISODE : "" + EPISODE_EVENT ||--o{ CONCEPT : "" + METADATA ||--o{ CONCEPT : "" + CDM_SOURCE ||--o{ CONCEPT : "" + CONCEPT ||--o{ DOMAIN : "" + CONCEPT ||--o{ VOCABULARY : "" + CONCEPT ||--o{ CONCEPT_CLASS : "" + VOCABULARY ||--o{ CONCEPT : "" + DOMAIN ||--o{ CONCEPT : "" + CONCEPT_CLASS ||--o{ CONCEPT : "" + CONCEPT_RELATIONSHIP ||--o{ CONCEPT : "" + CONCEPT_RELATIONSHIP ||--o{ RELATIONSHIP : "" + RELATIONSHIP ||--o{ CONCEPT : "" + CONCEPT_SYNONYM ||--o{ CONCEPT : "" + CONCEPT_ANCESTOR ||--o{ CONCEPT : "" + SOURCE_TO_CONCEPT_MAP ||--o{ CONCEPT : "" + SOURCE_TO_CONCEPT_MAP ||--o{ VOCABULARY : "" + DRUG_STRENGTH ||--o{ CONCEPT : "" + COHORT_DEFINITION ||--o{ CONCEPT : "" diff --git a/extras/createERDiagram.R b/extras/createERDiagram.R new file mode 100644 index 0000000..b5ac673 --- /dev/null +++ b/extras/createERDiagram.R @@ -0,0 +1,55 @@ + +cdmVersion <- '5.4' +cdmPart <- c('CDM','VOCAB', 'RESULTS') +cdmTableCsvLoc <- system.file(file.path("csv", paste0("OMOP_CDMv", cdmVersion, "_Table_Level.csv")), package = "CommonDataModel", mustWork = TRUE) +cdmFieldCsvLoc <- system.file(file.path("csv", paste0("OMOP_CDMv", cdmVersion, "_Field_Level.csv")), package = "CommonDataModel", mustWork = TRUE) + +tableSpecs <- read.csv(cdmTableCsvLoc, stringsAsFactors = FALSE) +cdmSpecs <- read.csv(cdmFieldCsvLoc, stringsAsFactors = FALSE) + +mermaidDdlLines <- c() +mermaidFkLines <- c() +for (i in 1:nrow(tableSpecs)) { + table <- tableSpecs[i,] + tableName <- table$cdmTableName + if (!(table$schema %in% cdmPart)) { + next + } + mermaidDdlLines <- c(mermaidDdlLines, + sprintf(' %s {', tableName)) + + fields <- subset(cdmSpecs, cdmTableName == tableName) + for (j in 1:nrow(fields)) { + field <- fields[j,] + cdmFieldName <- field$cdmFieldName + cdmDataType <- field$cdmDatatype + if (startsWith(cdmDataType, 'varchar')) { + cdmDataType <- 'varchar' + } + if (cdmFieldName == '"offset"') { + cdmFieldName <- 'offset' + } + mermaidDdlLines <- c(mermaidDdlLines, + sprintf(' %s %s', cdmFieldName, cdmDataType)) + + if (field$isForeignKey == 'Yes') { + fkTable <- subset(tableSpecs, cdmTableName == field$fkTableName) + if (!(fkTable$schema %in% cdmPart)) { + next + } + + fkRelation <- sprintf(' %s ||--o{ %s : ""', tableName, field$fkTableName) + if (fkRelation %in% mermaidFkLines) { + next + } + mermaidFkLines <- c(mermaidFkLines, + fkRelation) + } + } + mermaidDdlLines <- c(mermaidDdlLines, ' }') +} + +mermaidString <- paste(c('erDiagram', mermaidDdlLines, mermaidFkLines), collapse = '\n') +fileName <- sprintf('OMOP_CDMv%s_ER_Diagram.mmd', cdmVersion) +write(mermaidString, file.path('extras', fileName)) + From 0c07bfe8813de44175a2e5b5a5a0ca9a8075a3c8 Mon Sep 17 00:00:00 2001 From: Maxim Moinat Date: Thu, 1 Dec 2022 13:59:57 +0100 Subject: [PATCH 11/39] add option to only include subset of tables --- extras/createERDiagram.R | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/extras/createERDiagram.R b/extras/createERDiagram.R index b5ac673..5e961cb 100644 --- a/extras/createERDiagram.R +++ b/extras/createERDiagram.R @@ -1,6 +1,8 @@ cdmVersion <- '5.4' cdmPart <- c('CDM','VOCAB', 'RESULTS') +cdmTables <- NULL #c('PERSON', 'OBSERVATION_PERIOD', 'VISIT_OCCURRENCE', 'CONDITION_OCCURRENCE', 'CONCEPT') + cdmTableCsvLoc <- system.file(file.path("csv", paste0("OMOP_CDMv", cdmVersion, "_Table_Level.csv")), package = "CommonDataModel", mustWork = TRUE) cdmFieldCsvLoc <- system.file(file.path("csv", paste0("OMOP_CDMv", cdmVersion, "_Field_Level.csv")), package = "CommonDataModel", mustWork = TRUE) @@ -15,6 +17,9 @@ for (i in 1:nrow(tableSpecs)) { if (!(table$schema %in% cdmPart)) { next } + if (!is.null(cdmTables) && !(table$cdmTableName %in% cdmTables)) { + next + } mermaidDdlLines <- c(mermaidDdlLines, sprintf(' %s {', tableName)) @@ -37,6 +42,9 @@ for (i in 1:nrow(tableSpecs)) { if (!(fkTable$schema %in% cdmPart)) { next } + if (!is.null(cdmTables) && !(fkTable$cdmTableName %in% cdmTables)) { + next + } fkRelation <- sprintf(' %s ||--o{ %s : ""', tableName, field$fkTableName) if (fkRelation %in% mermaidFkLines) { From ad666fdd9d879e9e6cfac18d466121b134e7ff53 Mon Sep 17 00:00:00 2001 From: Maxim Moinat Date: Thu, 6 Jun 2024 17:31:54 +0200 Subject: [PATCH 12/39] remove drug end date convention --- inst/csv/OMOP_CDMv5.3_Field_Level.csv | 242 +++++++++++++------------- inst/csv/OMOP_CDMv5.4_Field_Level.csv | 6 +- 2 files changed, 124 insertions(+), 124 deletions(-) diff --git a/inst/csv/OMOP_CDMv5.3_Field_Level.csv b/inst/csv/OMOP_CDMv5.3_Field_Level.csv index 7f17c1a..3f52888 100644 --- a/inst/csv/OMOP_CDMv5.3_Field_Level.csv +++ b/inst/csv/OMOP_CDMv5.3_Field_Level.csv @@ -27,12 +27,12 @@ visit_occurrence,person_id,Yes,integer,NA,NA,No,Yes,PERSON,PERSON_ID,NA,NA,NA visit_occurrence,visit_concept_id,Yes,integer,"This field contains a concept id representing the kind of visit, like inpatient or outpatient. All concepts in this field should be standard and belong to the Visit domain.","Populate this field based on the kind of visit that took place for the person. For example this could be ""Inpatient Visit"", ""Outpatient Visit"", ""Ambulatory Visit"", etc. This table will contain standard concepts in the Visit domain. These concepts are arranged in a hierarchical structure to facilitate cohort definitions by rolling up to generally familiar Visits adopted in most healthcare systems worldwide. [Accepted Concepts](https://athena.ohdsi.org/search-terms/terms?domain=Visit&standardConcept=Standard&page=1&pageSize=15&query=).",No,Yes,CONCEPT,CONCEPT_ID,Visit,NA,NA visit_occurrence,visit_start_date,Yes,date,"For inpatient visits, the start date is typically the admission date. For outpatient visits the start date and end date will be the same.","When populating VISIT_START_DATE, you should think about the patient experience to make decisions on how to define visits. In the case of an inpatient visit this should be the date the patient was admitted to the hospital or institution. In all other cases this should be the date of the patient-provider interaction. If this information is not available the record should be dropped.",No,No,NA,NA,NA,NA,NA visit_occurrence,visit_start_datetime,No,datetime,NA,"If no time is given for the start date of a visit, set it to midnight (00:00:0000).",No,No,NA,NA,NA,NA,NA -visit_occurrence,visit_end_date,Yes,date,For inpatient visits the end date is typically the discharge date.,"Visit end dates are mandatory. If end dates are not provided in the source there are three ways in which to derive them: -- Outpatient Visit: visit_end_datetime = visit_start_datetime -- Emergency Room Visit: visit_end_datetime = visit_start_datetime -- Inpatient Visit: Usually there is information about discharge. If not, you should be able to derive the end date from the sudden decline of activity or from the absence of inpatient procedures/drugs. -- Non-hospital institution Visits: Particularly for claims data, if end dates are not provided assume the visit is for the duration of month that it occurs. -For Inpatient Visits ongoing at the date of ETL, put date of processing the data into visit_end_datetime and visit_type_concept_id with 32220 ""Still patient"" to identify the visit as incomplete. +visit_occurrence,visit_end_date,Yes,date,For inpatient visits the end date is typically the discharge date.,"Visit end dates are mandatory. If end dates are not provided in the source there are three ways in which to derive them: +- Outpatient Visit: visit_end_datetime = visit_start_datetime +- Emergency Room Visit: visit_end_datetime = visit_start_datetime +- Inpatient Visit: Usually there is information about discharge. If not, you should be able to derive the end date from the sudden decline of activity or from the absence of inpatient procedures/drugs. +- Non-hospital institution Visits: Particularly for claims data, if end dates are not provided assume the visit is for the duration of month that it occurs. +For Inpatient Visits ongoing at the date of ETL, put date of processing the data into visit_end_datetime and visit_type_concept_id with 32220 ""Still patient"" to identify the visit as incomplete. - All other Visits: visit_end_datetime = visit_start_datetime. If this is a one-day visit the end date should match the start date.",No,No,NA,NA,NA,NA,NA visit_occurrence,visit_end_datetime,No,datetime,NA,"If no time is given for the end date of a visit, set it to midnight (00:00:0000).",No,No,NA,NA,NA,NA,NA visit_occurrence,visit_type_concept_id,Yes,Integer,"Use this field to understand the provenance of the visit record, or where the record comes from.","Populate this field based on the provenance of the visit record, as in whether it came from an EHR record or billing claim. [Accepted Concepts](https://athena.ohdsi.org/search-terms/terms?domain=Type+Concept&standardConcept=Standard&page=1&pageSize=15&query=). A more detailed explanation of each Type Concept can be found on the [vocabulary wiki](https://github.com/OHDSI/Vocabulary-v5.0/wiki/Vocab.-TYPE_CONCEPT).",No,Yes,CONCEPT,CONCEPT_ID,Type Concept,NA,NA @@ -50,12 +50,12 @@ visit_detail,person_id,Yes,integer,NA,NA,No,Yes,PERSON,PERSON_ID,NA,NA,NA visit_detail,visit_detail_concept_id,Yes,integer,"This field contains a concept id representing the kind of visit detail, like inpatient or outpatient. All concepts in this field should be standard and belong to the Visit domain.","Populate this field based on the kind of visit that took place for the person. For example this could be ""Inpatient Visit"", ""Outpatient Visit"", ""Ambulatory Visit"", etc. This table will contain standard concepts in the Visit domain. These concepts are arranged in a hierarchical structure to facilitate cohort definitions by rolling up to generally familiar Visits adopted in most healthcare systems worldwide. [Accepted Concepts](https://athena.ohdsi.org/search-terms/terms?domain=Visit&standardConcept=Standard&page=1&pageSize=15&query=).",No,Yes,CONCEPT,CONCEPT_ID,Visit,NA,NA visit_detail,visit_detail_start_date,Yes,date,This is the date of the start of the encounter. This may or may not be equal to the date of the Visit the Visit Detail is associated with.,"When populating VISIT_DETAIL_START_DATE, you should think about the patient experience to make decisions on how to define visits. Most likely this should be the date of the patient-provider interaction.",No,No,NA,NA,NA,NA,NA visit_detail,visit_detail_start_datetime,No,datetime,NA,"If no time is given for the start date of a visit, set it to midnight (00:00:0000).",No,No,NA,NA,NA,NA,NA -visit_detail,visit_detail_end_date,Yes,date,This the end date of the patient-provider interaction.,"Visit Detail end dates are mandatory. If end dates are not provided in the source there are three ways in which to derive them:
-- Outpatient Visit Detail: visit_detail_end_datetime = visit_detail_start_datetime -- Emergency Room Visit Detail: visit_detail_end_datetime = visit_detail_start_datetime -- Inpatient Visit Detail: Usually there is information about discharge. If not, you should be able to derive the end date from the sudden decline of activity or from the absence of inpatient procedures/drugs. -- Non-hospital institution Visit Details: Particularly for claims data, if end dates are not provided assume the visit is for the duration of month that it occurs.
-For Inpatient Visit Details ongoing at the date of ETL, put date of processing the data into visit_detai_end_datetime and visit_detail_type_concept_id with 32220 ""Still patient"" to identify the visit as incomplete. +visit_detail,visit_detail_end_date,Yes,date,This the end date of the patient-provider interaction.,"Visit Detail end dates are mandatory. If end dates are not provided in the source there are three ways in which to derive them:
+- Outpatient Visit Detail: visit_detail_end_datetime = visit_detail_start_datetime +- Emergency Room Visit Detail: visit_detail_end_datetime = visit_detail_start_datetime +- Inpatient Visit Detail: Usually there is information about discharge. If not, you should be able to derive the end date from the sudden decline of activity or from the absence of inpatient procedures/drugs. +- Non-hospital institution Visit Details: Particularly for claims data, if end dates are not provided assume the visit is for the duration of month that it occurs.
+For Inpatient Visit Details ongoing at the date of ETL, put date of processing the data into visit_detai_end_datetime and visit_detail_type_concept_id with 32220 ""Still patient"" to identify the visit as incomplete. All other Visits Details: visit_detail_end_datetime = visit_detail_start_datetime.",No,No,NA,NA,NA,NA,NA visit_detail,visit_detail_end_datetime,No,datetime,NA,"If no time is given for the end date of a visit, set it to midnight (00:00:0000).",No,No,NA,NA,NA,NA,NA visit_detail,visit_detail_type_concept_id,Yes,integer,"Use this field to understand the provenance of the visit detail record, or where the record comes from.","Populate this field based on the provenance of the visit detail record, as in whether it came from an EHR record or billing claim. [Accepted Concepts](https://athena.ohdsi.org/search-terms/terms?domain=Type+Concept&standardConcept=Standard&page=1&pageSize=15&query=). A more detailed explanation of each Type Concept can be found on the [vocabulary wiki](https://github.com/OHDSI/Vocabulary-v5.0/wiki/Vocab.-TYPE_CONCEPT).",No,Yes,CONCEPT,CONCEPT_ID,Type Concept,NA,NA @@ -88,17 +88,17 @@ condition_occurrence,condition_source_concept_id,No,integer,"This is the concept condition_occurrence,condition_status_source_value,No,varchar(50),This field houses the verbatim value from the source data representing the condition status.,This information may be called something different in the source data but the field is meant to contain a value indicating when and how a diagnosis was given to a patient. This source value is mapped to a standard concept which is stored in the CONDITION_STATUS_CONCEPT_ID field.,No,No,NA,NA,NA,NA,NA drug_exposure,drug_exposure_id,Yes,integer,The unique key given to records of drug dispensings or administrations for a person. Refer to the ETL for how duplicate drugs during the same visit were handled.,"Each instance of a drug dispensing or administration present in the source data should be assigned this unique key. In some cases, a person can have multiple records of the same drug within the same visit. It is valid to keep these duplicates and assign them individual, unique, DRUG_EXPOSURE_IDs, though it is up to the ETL how they should be handled.",Yes,No,NA,NA,NA,NA,NA drug_exposure,person_id,Yes,integer,The PERSON_ID of the PERSON for whom the drug dispensing or administration is recorded. This may be a system generated code.,NA,No,Yes,PERSON,PERSON_ID,NA,NA,NA -drug_exposure,drug_concept_id,Yes,integer,"The DRUG_CONCEPT_ID field is recommended for primary use in analyses, and must be used for network studies. This is the standard concept mapped from the source concept id which represents a drug product or molecule otherwise introduced to the body. The drug concepts can have a varying degree of information about drug strength and dose. This information is relevant in the context of quantity and administration information in the subsequent fields plus strength information from the DRUG_STRENGTH table, provided as part of the standard vocabulary download.","The CONCEPT_ID that the DRUG_SOURCE_VALUE maps to. The concept id should be derived either from mapping from the source concept id or by picking the drug concept representing the most amount of detail you have. Records whose source values map to standard concepts with a domain of Drug should go in this table. When the Drug Source Value of the code cannot be translated into Standard Drug Concept IDs, a Drug exposure entry is stored with only the corresponding SOURCE_CONCEPT_ID and DRUG_SOURCE_VALUE and a DRUG_CONCEPT_ID of 0. The Drug Concept with the most detailed content of information is preferred during the mapping process. These are indicated in the CONCEPT_CLASS_ID field of the Concept and are recorded in the following order of precedence: Marketed Product, Branded Pack, Clinical Pack, Branded Drug, Clinical Drug, Branded Drug Component, Clinical Drug Component, Branded Drug Form, Clinical Drug Form, and only if no other information is available Ingredient. Note: If only the drug class is known, the DRUG_CONCEPT_ID field should contain 0. [Accepted Concepts](https://athena.ohdsi.org/search-terms/terms?domain=Drug&standardConcept=Standard&page=1&pageSize=15&query=).",No,Yes,CONCEPT,CONCEPT_ID,Drug,NA,NA +drug_exposure,drug_concept_id,Yes,integer,"The DRUG_CONCEPT_ID field is recommended for primary use in analyses, and must be used for network studies. This is the standard concept mapped from the source concept id which represents a drug product or molecule otherwise introduced to the body. The drug concepts can have a varying degree of information about drug strength and dose. This information is relevant in the context of quantity and administration information in the subsequent fields plus strength information from the DRUG_STRENGTH table, provided as part of the standard vocabulary download.","The CONCEPT_ID that the DRUG_SOURCE_VALUE maps to. The concept id should be derived either from mapping from the source concept id or by picking the drug concept representing the most amount of detail you have. Records whose source values map to standard concepts with a domain of Drug should go in this table. When the Drug Source Value of the code cannot be translated into Standard Drug Concept IDs, a Drug exposure entry is stored with only the corresponding SOURCE_CONCEPT_ID and DRUG_SOURCE_VALUE and a DRUG_CONCEPT_ID of 0. The Drug Concept with the most detailed content of information is preferred during the mapping process. These are indicated in the CONCEPT_CLASS_ID field of the Concept and are recorded in the following order of precedence: �Marketed Product�, �Branded Pack�, �Clinical Pack�, �Branded Drug�, �Clinical Drug�, �Branded Drug Component�, �Clinical Drug Component�, �Branded Drug Form�, �Clinical Drug Form�, and only if no other information is available �Ingredient�. Note: If only the drug class is known, the DRUG_CONCEPT_ID field should contain 0. [Accepted Concepts](https://athena.ohdsi.org/search-terms/terms?domain=Drug&standardConcept=Standard&page=1&pageSize=15&query=).",No,Yes,CONCEPT,CONCEPT_ID,Drug,NA,NA drug_exposure,drug_exposure_start_date,Yes,date,Use this date to determine the start date of the drug record.,"Valid entries include a start date of a prescription, the date a prescription was filled, or the date on which a Drug administration was recorded. It is a valid ETL choice to use the date the drug was ordered as the DRUG_EXPOSURE_START_DATE.",No,No,NA,NA,NA,NA,NA drug_exposure,drug_exposure_start_datetime,No,datetime,NA,"This is not required, though it is in v6. If a source does not specify datetime the convention is to set the time to midnight (00:00:0000)",No,No,NA,NA,NA,NA,NA -drug_exposure,drug_exposure_end_date,Yes,date,The DRUG_EXPOSURE_END_DATE denotes the day the drug exposure ended for the patient.,"If this information is not explicitly available in the data, infer the end date using the following methods:

1. Start first with duration or days supply using the calculation drug start date + days supply -1 day. 2. Use quantity divided by daily dose that you may obtain from the sig or a source field (or assumed daily dose of 1) for solid, indivisibile, drug products. If quantity represents ingredient amount, quantity divided by daily dose * concentration (from drug_strength) drug concept id tells you the dose form. 3. If it is an administration record, set drug end date equal to drug start date. If the record is a written prescription then set end date to start date + 29. If the record is a mail-order prescription set end date to start date + 89. The end date must be equal to or greater than the start date. Ibuprofen 20mg/mL oral solution concept tells us this is oral solution. Calculate duration as quantity (200 example) * daily dose (5mL) /concentration (20mg/mL) 200*5/20 = 50 days. [Examples by dose form](https://ohdsi.github.io/CommonDataModel/drug_dose.html)

For detailed conventions for how to populate this field, please see the [THEMIS repository](https://ohdsi.github.io/Themis/tag_drug_exposure.html).",No,No,NA,NA,NA,NA,NA +drug_exposure,drug_exposure_end_date,Yes,date,The DRUG_EXPOSURE_END_DATE denotes the day the drug exposure ended for the patient.,"If this information is not explicitly available in the data, infer the end date from start date and duration.
For detailed conventions for how to populate this field, please see the [THEMIS repository](https://ohdsi.github.io/Themis/tag_drug_exposure.html).",No,No,NA,NA,NA,NA,NA drug_exposure,drug_exposure_end_datetime,No,datetime,NA,"This is not required, though it is in v6. If a source does not specify datetime the convention is to set the time to midnight (00:00:0000)",No,No,NA,NA,NA,NA,NA drug_exposure,verbatim_end_date,No,date,"This is the end date of the drug exposure as it appears in the source data, if it is given",Put the end date or discontinuation date as it appears from the source data or leave blank if unavailable.,No,No,NA,NA,NA,NA,NA drug_exposure,drug_type_concept_id,Yes,integer,"You can use the TYPE_CONCEPT_ID to delineate between prescriptions written vs. prescriptions dispensed vs. medication history vs. patient-reported exposure, etc.","Choose the drug_type_concept_id that best represents the provenance of the record, for example whether it came from a record of a prescription written or physician administered drug. [Accepted Concepts](https://athena.ohdsi.org/search-terms/terms?domain=Type+Concept&standardConcept=Standard&page=1&pageSize=15&query=). A more detailed explanation of each Type Concept can be found on the [vocabulary wiki](https://github.com/OHDSI/Vocabulary-v5.0/wiki/Vocab.-TYPE_CONCEPT).",No,Yes,CONCEPT,CONCEPT_ID,Type Concept,NA,NA drug_exposure,stop_reason,No,varchar(20),"The reason a person stopped a medication as it is represented in the source. Reasons include regimen completed, changed, removed, etc. This field will be retired in v6.0.",This information is often not populated in source data and it is a valid etl choice to leave it blank if the information does not exist.,No,No,NA,NA,NA,NA,NA drug_exposure,refills,No,integer,This is only filled in when the record is coming from a prescription written this field is meant to represent intended refills at time of the prescription.,NA,No,No,NA,NA,NA,NA,NA -drug_exposure,quantity,No,float,NA,"To find the dose form of a drug the RELATIONSHIP table can be used where the relationship_id is 'Has dose form'. If liquid, quantity stands for the total amount dispensed or ordered of ingredient in the units given by the drug_strength table. If the unit from the source data does not align with the unit in the DRUG_STRENGTH table the quantity should be converted to the correct unit given in DRUG_STRENGTH. For clinical drugs with fixed dose forms (tablets etc.) the quantity is the number of units/tablets/capsules prescribed or dispensed (can be partial, but then only 1/2 or 1/3, not 0.01). Clinical drugs with divisible dose forms (injections) the quantity is the amount of ingredient the patient got. For example, if the injection is 2mg/mL but the patient got 80mL then quantity is reported as 160. -Quantified clinical drugs with divisible dose forms (prefilled syringes), the quantity is the amount of ingredient similar to clinical drugs. Please see [how to calculate drug dose](https://ohdsi.github.io/CommonDataModel/drug_dose.html) for more information. +drug_exposure,quantity,No,float,NA,"To find the dose form of a drug the RELATIONSHIP table can be used where the relationship_id is 'Has dose form'. If liquid, quantity stands for the total amount dispensed or ordered of ingredient in the units given by the drug_strength table. If the unit from the source data does not align with the unit in the DRUG_STRENGTH table the quantity should be converted to the correct unit given in DRUG_STRENGTH. For clinical drugs with fixed dose forms (tablets etc.) the quantity is the number of units/tablets/capsules prescribed or dispensed (can be partial, but then only 1/2 or 1/3, not 0.01). Clinical drugs with divisible dose forms (injections) the quantity is the amount of ingredient the patient got. For example, if the injection is 2mg/mL but the patient got 80mL then quantity is reported as 160. +Quantified clinical drugs with divisible dose forms (prefilled syringes), the quantity is the amount of ingredient similar to clinical drugs. Please see [how to calculate drug dose](https://ohdsi.github.io/CommonDataModel/drug_dose.html) for more information. ",No,No,NA,NA,NA,NA,NA drug_exposure,days_supply,No,integer,The number of days of supply of the medication as recorded in the original prescription or dispensing record. Days supply can differ from actual drug duration (i.e. prescribed days supply vs actual exposure).,"The field should be left empty if the source data does not contain a verbatim days_supply, and should not be calculated from other fields.

Negative values are not allowed. If the source has negative days supply the record should be dropped as it is unknown if the patient actually took the drug. Several actions are possible: 1) record is not trustworthy and we remove the record entirely. 2) we trust the record and leave days_supply empty or 3) record needs to be combined with other record (e.g. reversal of prescription). High values (>365 days) should be investigated. If considered an error in the source data (e.g. typo), the value needs to be excluded to prevent creation of unrealistic long eras.",No,No,NA,NA,NA,NA,NA drug_exposure,sig,No,varchar(MAX),This is the verbatim instruction for the drug as written by the provider.,"Put the written out instructions for the drug as it is verbatim in the source, if available.",No,No,NA,NA,NA,NA,NA @@ -142,7 +142,7 @@ device_exposure,device_source_value,No,varchar(50),"This field houses the verbat device_exposure,device_source_concept_id,No,integer,"This is the concept representing the device source value and may not necessarily be standard. This field is discouraged from use in analysis because it is not required to contain Standard Concepts that are used across the OHDSI community, and should only be used when Standard Concepts do not adequately represent the source detail for the Device necessary for a given analytic use case. Consider using DEVICE_CONCEPT_ID instead to enable standardized analytics that can be consistent across the network.",If the DEVICE_SOURCE_VALUE is coded in the source data using an OMOP supported vocabulary put the concept id representing the source value here.,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA measurement,measurement_id,Yes,integer,The unique key given to a Measurement record for a Person. Refer to the ETL for how duplicate Measurements during the same Visit were handled.,"Each instance of a measurement present in the source data should be assigned this unique key. In some cases, a person can have multiple records of the same measurement within the same visit. It is valid to keep these duplicates and assign them individual, unique, MEASUREMENT_IDs, though it is up to the ETL how they should be handled.",Yes,No,NA,NA,NA,NA,NA measurement,person_id,Yes,integer,The PERSON_ID of the Person for whom the Measurement is recorded. This may be a system generated code.,NA,No,Yes,PERSON,PERSON_ID,NA,NA,NA -measurement,measurement_concept_id,Yes,integer,"The MEASUREMENT_CONCEPT_ID field is recommended for primary use in analyses, and must be used for network studies. This is the standard concept mapped from the source value which represents a measurement.",The CONCEPT_ID that the MEASUREMENT_SOURCE_VALUE maps to. Only records whose source values map to concepts with a domain of Measurement should go in this table.,No,Yes,CONCEPT,CONCEPT_ID,Measurement,NA,NA +measurement,measurement_concept_id,Yes,integer,"The MEASUREMENT_CONCEPT_ID field is recommended for primary use in analyses, and must be used for network studies. This is the standard concept mapped from the source value which represents a measurement.",The CONCEPT_ID that the MEASUREMENT_SOURCE_VALUE maps to. Only records whose source values map to concepts with a domain of �Measurement� should go in this table.,No,Yes,CONCEPT,CONCEPT_ID,Measurement,NA,NA measurement,measurement_date,Yes,date,Use this date to determine the date of the measurement.,"If there are multiple dates in the source data associated with a record such as order_date, draw_date, and result_date, choose the one that is closest to the date the sample was drawn from the patient.",No,No,NA,NA,NA,NA,NA measurement,measurement_datetime,No,datetime,NA,"This is not required, though it is in v6. If a source does not specify datetime the convention is to set the time to midnight (00:00:0000)",No,No,NA,NA,NA,NA,NA measurement,measurement_time,No,varchar(10),NA,This is present for backwards compatibility and will be deprecated in an upcoming version.,No,No,NA,NA,NA,NA,NA @@ -190,7 +190,7 @@ note,person_id,Yes,integer,NA,NA,No,Yes,PERSON,PERSON_ID,NA,NA,NA note,note_date,Yes,date,The date the note was recorded.,NA,No,No,NA,NA,NA,NA,NA note,note_datetime,No,datetime,NA,If time is not given set the time to midnight.,No,No,NA,NA,NA,NA,NA note,note_type_concept_id,Yes,integer,The provenance of the note. Most likely this will be EHR.,"Put the source system of the note, as in EHR record. [Accepted Concepts](https://athena.ohdsi.org/search-terms/terms?standardConcept=Standard&domain=Type+Concept&page=1&pageSize=15&query=). A more detailed explanation of each Type Concept can be found on the [vocabulary wiki](https://github.com/OHDSI/Vocabulary-v5.0/wiki/Vocab.-TYPE_CONCEPT).",No,Yes,CONCEPT,CONCEPT_ID,Type Concept,NA,NA -note,note_class_concept_id,Yes,integer,"A Standard Concept Id representing the HL7 LOINC +note,note_class_concept_id,Yes,integer,"A Standard Concept Id representing the HL7 LOINC Document Type Vocabulary classification of the note.",Map the note classification to a Standard Concept. For more information see the ETL Conventions in the description of the NOTE table. [Accepted Concepts](https://athena.ohdsi.org/search-terms/terms?standardConcept=Standard&conceptClass=Doc+Kind&conceptClass=Doc+Role&conceptClass=Doc+Setting&conceptClass=Doc+Subject+Matter&conceptClass=Doc+Type+of+Service&domain=Meas+Value&page=1&pageSize=15&query=). This Concept can alternatively be represented by concepts with the relationship 'Kind of (LOINC)' to [706391](https://athena.ohdsi.org/search-terms/terms/706391) (Note).,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA note,note_title,No,varchar(250),The title of the note.,NA,No,No,NA,NA,NA,NA,NA note,note_text,Yes,varchar(MAX),The content of the note.,NA,No,No,NA,NA,NA,NA,NA @@ -211,22 +211,22 @@ note_nlp,note_nlp_source_concept_id,No,integer,NA,NA,No,Yes,CONCEPT,CONCEPT_ID,N note_nlp,nlp_system,No,varchar(250),NA,Name and version of the NLP system that extracted the term. Useful for data provenance.,No,No,NA,NA,NA,NA,NA note_nlp,nlp_date,Yes,date,The date of the note processing.,NA,No,No,NA,NA,NA,NA,NA note_nlp,nlp_datetime,No,datetime,The date and time of the note processing.,NA,No,No,NA,NA,NA,NA,NA -note_nlp,term_exists,No,varchar(1),NA,"Term_exists is defined as a flag that indicates if the patient actually has or had the condition. Any of the following modifiers would make Term_exists false: -Negation = true -Subject = [anything other than the patient] -Conditional = true/li> -Rule_out = true -Uncertain = very low certainty or any lower certainties -A complete lack of modifiers would make Term_exists true. +note_nlp,term_exists,No,varchar(1),NA,"Term_exists is defined as a flag that indicates if the patient actually has or had the condition. Any of the following modifiers would make Term_exists false: +Negation = true +Subject = [anything other than the patient] +Conditional = true/li> +Rule_out = true +Uncertain = very low certainty or any lower certainties +A complete lack of modifiers would make Term_exists true. ",No,No,NA,NA,NA,NA,NA -note_nlp,term_temporal,No,varchar(50),NA,"Term_temporal is to indicate if a condition is present or just in the past. The following would be past:

-- History = true +note_nlp,term_temporal,No,varchar(50),NA,"Term_temporal is to indicate if a condition is present or just in the past. The following would be past:

+- History = true - Concept_date = anything before the time of the report",No,No,NA,NA,NA,NA,NA -note_nlp,term_modifiers,No,varchar(2000),NA,"For the modifiers that are there, they would have to have these values:

-- Negation = false -- Subject = patient -- Conditional = false -- Rule_out = false +note_nlp,term_modifiers,No,varchar(2000),NA,"For the modifiers that are there, they would have to have these values:

+- Negation = false +- Subject = patient +- Conditional = false +- Rule_out = false - Uncertain = true or high or moderate or even low (could argue about low). Term_modifiers will concatenate all modifiers for different types of entities (conditions, drugs, labs etc) into one string. Lab values will be saved as one of the modifiers.",No,No,NA,NA,NA,NA,NA specimen,specimen_id,Yes,integer,Unique identifier for each specimen.,NA,Yes,No,NA,NA,NA,NA,NA specimen,person_id,Yes,integer,The person from whom the specimen is collected.,NA,No,Yes,PERSON,PERSON_ID,NA,NA,NA @@ -318,9 +318,9 @@ drug_era,drug_era_id,Yes,integer,NA,NA,Yes,No,NA,NA,NA,NA,NA drug_era,person_id,Yes,integer,NA,NA,No,Yes,PERSON,PERSON_ID,NA,NA,NA drug_era,drug_concept_id,Yes,integer,The drug_concept_id should conform to the concept class 'ingredient' as the drug_era is an era of time where a person is exposed to a particular drug ingredient.,NA,No,Yes,CONCEPT,CONCEPT_ID,Drug,Ingredient,NA drug_era,drug_era_start_date,Yes,date,NA,"The Drug Era Start Date is the start date of the first Drug Exposure for a given ingredient, with at least 31 days since the previous exposure.",No,No,NA,NA,NA,NA,NA -drug_era,drug_era_end_date,Yes,date,NA,"The Drug Era End Date is the end date of the last Drug Exposure. The End Date of each Drug Exposure is either taken from the field drug_exposure_end_date or, as it is typically not available, inferred using the following rules: -For pharmacy prescription data, the date when the drug was dispensed plus the number of days of supply are used to extrapolate the End Date for the Drug Exposure. Depending on the country-specific healthcare system, this supply information is either explicitly provided in the day_supply field or inferred from package size or similar information. -For Procedure Drugs, usually the drug is administered on a single date (i.e., the administration date). +drug_era,drug_era_end_date,Yes,date,NA,"The Drug Era End Date is the end date of the last Drug Exposure. The End Date of each Drug Exposure is either taken from the field drug_exposure_end_date or, as it is typically not available, inferred using the following rules: +For pharmacy prescription data, the date when the drug was dispensed plus the number of days of supply are used to extrapolate the End Date for the Drug Exposure. Depending on the country-specific healthcare system, this supply information is either explicitly provided in the day_supply field or inferred from package size or similar information. +For Procedure Drugs, usually the drug is administered on a single date (i.e., the administration date). A standard Persistence Window of 30 days (gap, slack) is permitted between two subsequent such extrapolated DRUG_EXPOSURE records to be considered to be merged into a single Drug Era.",No,No,NA,NA,NA,NA,NA drug_era,drug_exposure_count,No,integer,The count of grouped DRUG_EXPOSURE records that were included in the DRUG_ERA row,NA,No,No,NA,NA,NA,NA,NA drug_era,gap_days,No,integer,NA,"The Gap Days determine how many total drug-free days are observed between all Drug Exposure events that contribute to a DRUG_ERA record. It is assumed that the drugs are ""not stockpiled"" by the patient, i.e. that if a new drug prescription or refill is observed (a new DRUG_EXPOSURE record is written), the remaining supply from the previous events is abandoned. The difference between Persistence Window and Gap Days is that the former is the maximum drug-free time allowed between two subsequent DRUG_EXPOSURE records, while the latter is the sum of actual drug-free days for the given Drug Era under the above assumption of non-stockpiling.",No,No,NA,NA,NA,NA,NA @@ -334,20 +334,20 @@ dose_era,dose_era_end_date,Yes,date,NA,The date the Person was no longer exposed condition_era,condition_era_id,Yes,integer,NA,NA,Yes,No,NA,NA,NA,NA,NA condition_era,person_id,Yes,integer,NA,NA,No,No,PERSON,PERSON_ID,NA,NA,NA condition_era,condition_concept_id,Yes,integer,The Concept Id representing the Condition.,NA,No,Yes,CONCEPT,CONCEPT_ID,Condition,NA,NA -condition_era,condition_era_start_date,Yes,date,"The start date for the Condition Era -constructed from the individual -instances of Condition Occurrences. -It is the start date of the very first -chronologically recorded instance of +condition_era,condition_era_start_date,Yes,date,"The start date for the Condition Era +constructed from the individual +instances of Condition Occurrences. +It is the start date of the very first +chronologically recorded instance of the condition with at least 31 days since any prior record of the same Condition.",NA,No,No,NA,NA,NA,NA,NA -condition_era,condition_era_end_date,Yes,date,"The end date for the Condition Era -constructed from the individual -instances of Condition Occurrences. -It is the end date of the final -continuously recorded instance of the +condition_era,condition_era_end_date,Yes,date,"The end date for the Condition Era +constructed from the individual +instances of Condition Occurrences. +It is the end date of the final +continuously recorded instance of the Condition.",NA,No,No,NA,NA,NA,NA,NA -condition_era,condition_occurrence_count,No,integer,"The number of individual Condition -Occurrences used to construct the +condition_era,condition_occurrence_count,No,integer,"The number of individual Condition +Occurrences used to construct the condition era.",NA,No,No,NA,NA,NA,NA,NA metadata,metadata_concept_id,Yes,integer,NA,NA,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA metadata,metadata_type_concept_id,Yes,integer,NA,NA,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA @@ -369,57 +369,57 @@ cdm_source,vocabulary_version,No,varchar(20),NA,NA,No,No,NA,NA,NA,NA,NA concept,concept_id,Yes,integer,A unique identifier for each Concept across all domains.,NA,Yes,No,NA,NA,NA,NA,NA concept,concept_name,Yes,varchar(255),"An unambiguous, meaningful and descriptive name for the Concept.",NA,No,No,NA,NA,NA,NA,NA concept,domain_id,Yes,varchar(20),A foreign key to the [DOMAIN](https://ohdsi.github.io/CommonDataModel/cdm531.html#domain) table the Concept belongs to.,NA,No,Yes,DOMAIN,DOMAIN_ID,NA,NA,NA -concept,vocabulary_id,Yes,varchar(20),"A foreign key to the [VOCABULARY](https://ohdsi.github.io/CommonDataModel/cdm531.html#vocabulary) -table indicating from which source the +concept,vocabulary_id,Yes,varchar(20),"A foreign key to the [VOCABULARY](https://ohdsi.github.io/CommonDataModel/cdm531.html#vocabulary) +table indicating from which source the Concept has been adapted.",NA,No,Yes,VOCABULARY,VOCABULARY_ID,NA,NA,NA -concept,concept_class_id,Yes,varchar(20),"The attribute or concept class of the -Concept. Examples are 'Clinical Drug', +concept,concept_class_id,Yes,varchar(20),"The attribute or concept class of the +Concept. Examples are 'Clinical Drug', 'Ingredient', 'Clinical Finding' etc.",NA,No,Yes,CONCEPT_CLASS,CONCEPT_CLASS_ID,NA,NA,NA -concept,standard_concept,No,varchar(1),"This flag determines where a Concept is -a Standard Concept, i.e. is used in the -data, a Classification Concept, or a -non-standard Source Concept. The -allowable values are 'S' (Standard -Concept) and 'C' (Classification +concept,standard_concept,No,varchar(1),"This flag determines where a Concept is +a Standard Concept, i.e. is used in the +data, a Classification Concept, or a +non-standard Source Concept. The +allowable values are 'S' (Standard +Concept) and 'C' (Classification Concept), otherwise the content is NULL.",NA,No,No,NA,NA,NA,NA,NA -concept,concept_code,Yes,varchar(50),"The concept code represents the identifier -of the Concept in the source vocabulary, -such as SNOMED-CT concept IDs, -RxNorm RXCUIs etc. Note that concept +concept,concept_code,Yes,varchar(50),"The concept code represents the identifier +of the Concept in the source vocabulary, +such as SNOMED-CT concept IDs, +RxNorm RXCUIs etc. Note that concept codes are not unique across vocabularies.",NA,No,No,NA,NA,NA,NA,NA -concept,valid_start_date,Yes,date,"The date when the Concept was first -recorded. The default value is -1-Jan-1970, meaning, the Concept has no +concept,valid_start_date,Yes,date,"The date when the Concept was first +recorded. The default value is +1-Jan-1970, meaning, the Concept has no (known) date of inception.",NA,No,No,NA,NA,NA,NA,NA -concept,valid_end_date,Yes,date,"The date when the Concept became -invalid because it was deleted or -superseded (updated) by a new concept. -The default value is 31-Dec-2099, -meaning, the Concept is valid until it +concept,valid_end_date,Yes,date,"The date when the Concept became +invalid because it was deleted or +superseded (updated) by a new concept. +The default value is 31-Dec-2099, +meaning, the Concept is valid until it becomes deprecated.",NA,No,No,NA,NA,NA,NA,NA -concept,invalid_reason,No,varchar(1),"Reason the Concept was invalidated. -Possible values are D (deleted), U -(replaced with an update) or NULL when +concept,invalid_reason,No,varchar(1),"Reason the Concept was invalidated. +Possible values are D (deleted), U +(replaced with an update) or NULL when valid_end_date has the default value.",NA,No,No,NA,NA,NA,NA,NA -vocabulary,vocabulary_id,Yes,varchar(20),"A unique identifier for each Vocabulary, such +vocabulary,vocabulary_id,Yes,varchar(20),"A unique identifier for each Vocabulary, such as ICD9CM, SNOMED, Visit.",NA,Yes,No,NA,NA,NA,NA,NA -vocabulary,vocabulary_name,Yes,varchar(255),"The name describing the vocabulary, for -example, International Classification of -Diseases, Ninth Revision, Clinical +vocabulary,vocabulary_name,Yes,varchar(255),"The name describing the vocabulary, for +example, International Classification of +Diseases, Ninth Revision, Clinical Modification, Volume 1 and 2 (NCHS) etc.",NA,No,No,NA,NA,NA,NA,NA -vocabulary,vocabulary_reference,Yes,varchar(255),"External reference to documentation or -available download of the about the +vocabulary,vocabulary_reference,Yes,varchar(255),"External reference to documentation or +available download of the about the vocabulary.",NA,No,No,NA,NA,NA,NA,NA -vocabulary,vocabulary_version,No,varchar(255),"Version of the Vocabulary as indicated in +vocabulary,vocabulary_version,No,varchar(255),"Version of the Vocabulary as indicated in the source.",NA,No,No,NA,NA,NA,NA,NA vocabulary,vocabulary_concept_id,Yes,integer,A Concept that represents the Vocabulary the VOCABULARY record belongs to.,NA,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA domain,domain_id,Yes,varchar(20),A unique key for each domain.,NA,Yes,No,NA,NA,NA,NA,NA -domain,domain_name,Yes,varchar(255),"The name describing the Domain, e.g. -Condition, Procedure, Measurement +domain,domain_name,Yes,varchar(255),"The name describing the Domain, e.g. +Condition, Procedure, Measurement etc.",NA,No,No,NA,NA,NA,NA,NA domain,domain_concept_id,Yes,integer,A Concept representing the Domain Concept the DOMAIN record belongs to.,NA,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA concept_class,concept_class_id,Yes,varchar(20),A unique key for each class.,NA,Yes,No,NA,NA,NA,NA,NA -concept_class,concept_class_name,Yes,varchar(255),"The name describing the Concept Class, e.g. +concept_class,concept_class_name,Yes,varchar(255),"The name describing the Concept Class, e.g. Clinical Finding, Ingredient, etc.",NA,No,No,NA,NA,NA,NA,NA concept_class,concept_class_concept_id,Yes,integer,A Concept that represents the Concept Class.,NA,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA concept_relationship,concept_id_1,Yes,integer,NA,NA,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA @@ -428,63 +428,63 @@ concept_relationship,relationship_id,Yes,varchar(20),The relationship between CO concept_relationship,valid_start_date,Yes,date,The date when the relationship is first recorded.,NA,No,No,NA,NA,NA,NA,NA concept_relationship,valid_end_date,Yes,date,The date when the relationship is invalidated.,NA,No,No,NA,NA,NA,NA,NA concept_relationship,invalid_reason,No,varchar(1),"Reason the relationship was invalidated. Possible values are 'D' (deleted), 'U' (updated) or NULL.",NA,No,No,NA,NA,NA,NA,NA -relationship,relationship_id,Yes,varchar(20),"The type of relationship captured by the +relationship,relationship_id,Yes,varchar(20),"The type of relationship captured by the relationship record.",NA,Yes,No,NA,NA,NA,NA,NA relationship,relationship_name,Yes,varchar(255),NA,NA,No,No,NA,NA,NA,NA,NA -relationship,is_hierarchical,Yes,varchar(1),"Defines whether a relationship defines -concepts into classes or hierarchies. Values +relationship,is_hierarchical,Yes,varchar(1),"Defines whether a relationship defines +concepts into classes or hierarchies. Values are 1 for hierarchical relationship or 0 if not.",NA,No,No,NA,NA,NA,NA,NA -relationship,defines_ancestry,Yes,varchar(1),"Defines whether a hierarchical relationship -contributes to the concept_ancestor table. -These are subsets of the hierarchical +relationship,defines_ancestry,Yes,varchar(1),"Defines whether a hierarchical relationship +contributes to the concept_ancestor table. +These are subsets of the hierarchical relationships. Valid values are 1 or 0.",NA,No,No,NA,NA,NA,NA,NA -relationship,reverse_relationship_id,Yes,varchar(20),"The identifier for the relationship used to -define the reverse relationship between two +relationship,reverse_relationship_id,Yes,varchar(20),"The identifier for the relationship used to +define the reverse relationship between two concepts.",NA,No,No,NA,NA,NA,NA,NA -relationship,relationship_concept_id,Yes,integer,"A foreign key that refers to an identifier in -the [CONCEPT](https://ohdsi.github.io/CommonDataModel/cdm531.html#concept) table for the unique +relationship,relationship_concept_id,Yes,integer,"A foreign key that refers to an identifier in +the [CONCEPT](https://ohdsi.github.io/CommonDataModel/cdm531.html#concept) table for the unique relationship concept.",NA,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA concept_synonym,concept_id,Yes,integer,NA,NA,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA concept_synonym,concept_synonym_name,Yes,varchar(1000),NA,NA,No,No,NA,NA,NA,NA,NA concept_synonym,language_concept_id,Yes,integer,NA,NA,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA -concept_ancestor,ancestor_concept_id,Yes,integer,"The Concept Id for the higher-level concept +concept_ancestor,ancestor_concept_id,Yes,integer,"The Concept Id for the higher-level concept that forms the ancestor in the relationship.",NA,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA -concept_ancestor,descendant_concept_id,Yes,integer,"The Concept Id for the lower-level concept -that forms the descendant in the +concept_ancestor,descendant_concept_id,Yes,integer,"The Concept Id for the lower-level concept +that forms the descendant in the relationship.",NA,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA -concept_ancestor,min_levels_of_separation,Yes,integer,"The minimum separation in number of -levels of hierarchy between ancestor and -descendant concepts. This is an attribute +concept_ancestor,min_levels_of_separation,Yes,integer,"The minimum separation in number of +levels of hierarchy between ancestor and +descendant concepts. This is an attribute that is used to simplify hierarchic analysis.",NA,No,No,NA,NA,NA,NA,NA -concept_ancestor,max_levels_of_separation,Yes,integer,"The maximum separation in number of -levels of hierarchy between ancestor and -descendant concepts. This is an attribute +concept_ancestor,max_levels_of_separation,Yes,integer,"The maximum separation in number of +levels of hierarchy between ancestor and +descendant concepts. This is an attribute that is used to simplify hierarchic analysis.",NA,No,No,NA,NA,NA,NA,NA -source_to_concept_map,source_code,Yes,varchar(50),"The source code being translated +source_to_concept_map,source_code,Yes,varchar(50),"The source code being translated into a Standard Concept.",NA,No,No,NA,NA,NA,NA,NA -source_to_concept_map,source_concept_id,Yes,integer,"A foreign key to the Source -Concept that is being translated +source_to_concept_map,source_concept_id,Yes,integer,"A foreign key to the Source +Concept that is being translated into a Standard Concept.","This is either 0 or should be a number above 2 billion, which are the Concepts reserved for site-specific codes and mappings.",No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA -source_to_concept_map,source_vocabulary_id,Yes,varchar(20),"A foreign key to the -VOCABULARY table defining the -vocabulary of the source code that -is being translated to a Standard +source_to_concept_map,source_vocabulary_id,Yes,varchar(20),"A foreign key to the +VOCABULARY table defining the +vocabulary of the source code that +is being translated to a Standard Concept.",NA,No,No,NA,NA,NA,NA,NA -source_to_concept_map,source_code_description,No,varchar(255),"An optional description for the -source code. This is included as a -convenience to compare the -description of the source code to +source_to_concept_map,source_code_description,No,varchar(255),"An optional description for the +source code. This is included as a +convenience to compare the +description of the source code to the name of the concept.",NA,No,No,NA,NA,NA,NA,NA -source_to_concept_map,target_concept_id,Yes,integer,"The target Concept -to which the source code is being +source_to_concept_map,target_concept_id,Yes,integer,"The target Concept +to which the source code is being mapped.",NA,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA source_to_concept_map,target_vocabulary_id,Yes,varchar(20),The Vocabulary of the target Concept.,NA,No,Yes,VOCABULARY,VOCABULARY_ID,NA,NA,NA -source_to_concept_map,valid_start_date,Yes,date,"The date when the mapping +source_to_concept_map,valid_start_date,Yes,date,"The date when the mapping instance was first recorded.",NA,No,No,NA,NA,NA,NA,NA -source_to_concept_map,valid_end_date,Yes,date,"The date when the mapping -instance became invalid because it -was deleted or superseded -(updated) by a new relationship. +source_to_concept_map,valid_end_date,Yes,date,"The date when the mapping +instance became invalid because it +was deleted or superseded +(updated) by a new relationship. Default value is 31-Dec-2099.",NA,No,No,NA,NA,NA,NA,NA source_to_concept_map,invalid_reason,No,varchar(1),"Reason the mapping instance was invalidated. Possible values are D (deleted), U (replaced with an update) or NULL when valid_end_date has the default value.",NA,No,No,NA,NA,NA,NA,NA drug_strength,drug_concept_id,Yes,integer,The Concept representing the Branded Drug or Clinical Drug Product.,NA,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA @@ -496,8 +496,8 @@ drug_strength,numerator_unit_concept_id,No,integer,The Concept representing the drug_strength,denominator_value,No,float,"The amount of total liquid (or other divisible product, such as ointment, gel, spray, etc.).",NA,No,No,NA,NA,NA,NA,NA drug_strength,denominator_unit_concept_id,No,integer,The Concept representing the denominator unit for the concentration of active ingredient.,NA,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA drug_strength,box_size,No,integer,The number of units of Clinical Branded Drug or Quantified Clinical or Branded Drug contained in a box as dispensed to the patient.,NA,No,No,NA,NA,NA,NA,NA -drug_strength,valid_start_date,Yes,date,"The date when the Concept was first -recorded. The default value is +drug_strength,valid_start_date,Yes,date,"The date when the Concept was first +recorded. The default value is 1-Jan-1970.",NA,No,No,NA,NA,NA,NA,NA drug_strength,valid_end_date,Yes,date,The date when then Concept became invalid.,NA,No,No,NA,NA,NA,NA,NA drug_strength,invalid_reason,No,varchar(1),"Reason the concept was invalidated. Possible values are D (deleted), U (replaced with an update) or NULL when valid_end_date has the default value.",NA,No,No,NA,NA,NA,NA,NA diff --git a/inst/csv/OMOP_CDMv5.4_Field_Level.csv b/inst/csv/OMOP_CDMv5.4_Field_Level.csv index 9c061b8..7817bb9 100644 --- a/inst/csv/OMOP_CDMv5.4_Field_Level.csv +++ b/inst/csv/OMOP_CDMv5.4_Field_Level.csv @@ -88,10 +88,10 @@ condition_occurrence,condition_source_concept_id,No,integer,"This is the concept condition_occurrence,condition_status_source_value,No,varchar(50),This field houses the verbatim value from the source data representing the condition status.,This information may be called something different in the source data but the field is meant to contain a value indicating when and how a diagnosis was given to a patient. This source value is mapped to a standard concept which is stored in the CONDITION_STATUS_CONCEPT_ID field.,No,No,NA,NA,NA,NA,NA drug_exposure,drug_exposure_id,Yes,integer,The unique key given to records of drug dispensings or administrations for a person. Refer to the ETL for how duplicate drugs during the same visit were handled.,"Each instance of a drug dispensing or administration present in the source data should be assigned this unique key. In some cases, a person can have multiple records of the same drug within the same visit. It is valid to keep these duplicates and assign them individual, unique, DRUG_EXPOSURE_IDs, though it is up to the ETL how they should be handled.",Yes,No,NA,NA,NA,NA,NA drug_exposure,person_id,Yes,integer,The PERSON_ID of the PERSON for whom the drug dispensing or administration is recorded. This may be a system generated code.,NA,No,Yes,PERSON,PERSON_ID,NA,NA,NA -drug_exposure,drug_concept_id,Yes,integer,"The DRUG_CONCEPT_ID field is recommended for primary use in analyses, and must be used for network studies. This is the standard concept mapped from the source concept id which represents a drug product or molecule otherwise introduced to the body. The drug concepts can have a varying degree of information about drug strength and dose. This information is relevant in the context of quantity and administration information in the subsequent fields plus strength information from the DRUG_STRENGTH table, provided as part of the standard vocabulary download.","The CONCEPT_ID that the DRUG_SOURCE_VALUE maps to. The concept id should be derived either from mapping from the source concept id or by picking the drug concept representing the most amount of detail you have. Records whose source values map to standard concepts with a domain of Drug should go in this table. When the Drug Source Value of the code cannot be translated into Standard Drug Concept IDs, a Drug exposure entry is stored with only the corresponding SOURCE_CONCEPT_ID and DRUG_SOURCE_VALUE and a DRUG_CONCEPT_ID of 0. The Drug Concept with the most detailed content of information is preferred during the mapping process. These are indicated in the CONCEPT_CLASS_ID field of the Concept and are recorded in the following order of precedence: Marketed Product, Branded Pack, Clinical Pack, Branded Drug, Clinical Drug, Branded Drug Component, Clinical Drug Component, Branded Drug Form, Clinical Drug Form, and only if no other information is available Ingredient. Note: If only the drug class is known, the DRUG_CONCEPT_ID field should contain 0. [Accepted Concepts](https://athena.ohdsi.org/search-terms/terms?domain=Drug&standardConcept=Standard&page=1&pageSize=15&query=).",No,Yes,CONCEPT,CONCEPT_ID,Drug,NA,NA +drug_exposure,drug_concept_id,Yes,integer,"The DRUG_CONCEPT_ID field is recommended for primary use in analyses, and must be used for network studies. This is the standard concept mapped from the source concept id which represents a drug product or molecule otherwise introduced to the body. The drug concepts can have a varying degree of information about drug strength and dose. This information is relevant in the context of quantity and administration information in the subsequent fields plus strength information from the DRUG_STRENGTH table, provided as part of the standard vocabulary download.","The CONCEPT_ID that the DRUG_SOURCE_VALUE maps to. The concept id should be derived either from mapping from the source concept id or by picking the drug concept representing the most amount of detail you have. Records whose source values map to standard concepts with a domain of Drug should go in this table. When the Drug Source Value of the code cannot be translated into Standard Drug Concept IDs, a Drug exposure entry is stored with only the corresponding SOURCE_CONCEPT_ID and DRUG_SOURCE_VALUE and a DRUG_CONCEPT_ID of 0. The Drug Concept with the most detailed content of information is preferred during the mapping process. These are indicated in the CONCEPT_CLASS_ID field of the Concept and are recorded in the following order of precedence: �Marketed Product�, �Branded Pack�, �Clinical Pack�, �Branded Drug�, �Clinical Drug�, �Branded Drug Component�, �Clinical Drug Component�, �Branded Drug Form�, �Clinical Drug Form�, and only if no other information is available �Ingredient�. Note: If only the drug class is known, the DRUG_CONCEPT_ID field should contain 0. [Accepted Concepts](https://athena.ohdsi.org/search-terms/terms?domain=Drug&standardConcept=Standard&page=1&pageSize=15&query=).",No,Yes,CONCEPT,CONCEPT_ID,Drug,NA,NA drug_exposure,drug_exposure_start_date,Yes,date,Use this date to determine the start date of the drug record.,"Valid entries include a start date of a prescription, the date a prescription was filled, or the date on which a Drug administration was recorded. It is a valid ETL choice to use the date the drug was ordered as the DRUG_EXPOSURE_START_DATE.",No,No,NA,NA,NA,NA,NA drug_exposure,drug_exposure_start_datetime,No,datetime,NA,"This is not required, though it is in v6. If a source does not specify datetime the convention is to set the time to midnight (00:00:0000)",No,No,NA,NA,NA,NA,NA -drug_exposure,drug_exposure_end_date,Yes,date,The DRUG_EXPOSURE_END_DATE denotes the day the drug exposure ended for the patient.,"If this information is not explicitly available in the data, infer the end date using the following methods:

1. Start first with duration or days supply using the calculation drug start date + days supply -1 day. 2. Use quantity divided by daily dose that you may obtain from the sig or a source field (or assumed daily dose of 1) for solid, indivisibile, drug products. If quantity represents ingredient amount, quantity divided by daily dose * concentration (from drug_strength) drug concept id tells you the dose form. 3. If it is an administration record, set drug end date equal to drug start date. If the record is a written prescription then set end date to start date + 29. If the record is a mail-order prescription set end date to start date + 89. The end date must be equal to or greater than the start date. Ibuprofen 20mg/mL oral solution concept tells us this is oral solution. Calculate duration as quantity (200 example) * daily dose (5mL) /concentration (20mg/mL) 200*5/20 = 50 days. [Examples by dose form](https://ohdsi.github.io/CommonDataModel/drug_dose.html)

For detailed conventions for how to populate this field, please see the [THEMIS repository](https://ohdsi.github.io/Themis/tag_drug_exposure.html).",No,No,NA,NA,NA,NA,NA +drug_exposure,drug_exposure_end_date,Yes,date,The DRUG_EXPOSURE_END_DATE denotes the day the drug exposure ended for the patient.,"If this information is not explicitly available in the data, infer the end date from start date and duration.
For detailed conventions for how to populate this field, please see the [THEMIS repository](https://ohdsi.github.io/Themis/tag_drug_exposure.html).",No,No,NA,NA,NA,NA,NA drug_exposure,drug_exposure_end_datetime,No,datetime,NA,"This is not required, though it is in v6. If a source does not specify datetime the convention is to set the time to midnight (00:00:0000)",No,No,NA,NA,NA,NA,NA drug_exposure,verbatim_end_date,No,date,"This is the end date of the drug exposure as it appears in the source data, if it is given",Put the end date or discontinuation date as it appears from the source data or leave blank if unavailable.,No,No,NA,NA,NA,NA,NA drug_exposure,drug_type_concept_id,Yes,integer,"You can use the TYPE_CONCEPT_ID to delineate between prescriptions written vs. prescriptions dispensed vs. medication history vs. patient-reported exposure, etc.","Choose the drug_type_concept_id that best represents the provenance of the record, for example whether it came from a record of a prescription written or physician administered drug. [Accepted Concepts](https://athena.ohdsi.org/search-terms/terms?domain=Type+Concept&standardConcept=Standard&page=1&pageSize=15&query=). A more detailed explanation of each Type Concept can be found on the [vocabulary wiki](https://github.com/OHDSI/Vocabulary-v5.0/wiki/Vocab.-TYPE_CONCEPT).",No,Yes,CONCEPT,CONCEPT_ID,Type Concept,NA,NA @@ -148,7 +148,7 @@ device_exposure,unit_source_value,No,varchar(50),"This field houses the verbatim device_exposure,unit_source_concept_id,No,integer,"This is the concept representing the UNIT_SOURCE_VALUE and may not necessarily be standard. This field is discouraged from use in analysis because it is not required to contain Standard Concepts that are used across the OHDSI community, and should only be used when Standard Concepts do not adequately represent the source detail for the Unit necessary for a given analytic use case. Consider using UNIT_CONCEPT_ID instead to enable standardized analytics that can be consistent across the network.",If the UNIT_SOURCE_VALUE is coded in the source data using an OMOP supported vocabulary put the concept id representing the source value here.,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA measurement,measurement_id,Yes,integer,The unique key given to a Measurement record for a Person. Refer to the ETL for how duplicate Measurements during the same Visit were handled.,"Each instance of a measurement present in the source data should be assigned this unique key. In some cases, a person can have multiple records of the same measurement within the same visit. It is valid to keep these duplicates and assign them individual, unique, MEASUREMENT_IDs, though it is up to the ETL how they should be handled.",Yes,No,NA,NA,NA,NA,NA measurement,person_id,Yes,integer,The PERSON_ID of the Person for whom the Measurement is recorded. This may be a system generated code.,NA,No,Yes,PERSON,PERSON_ID,NA,NA,NA -measurement,measurement_concept_id,Yes,integer,"The MEASUREMENT_CONCEPT_ID field is recommended for primary use in analyses, and must be used for network studies. This is the standard concept mapped from the source value which represents a measurement.",The CONCEPT_ID that the MEASUREMENT_SOURCE_VALUE maps to. Only records whose source values map to concepts with a domain of Measurement should go in this table.,No,Yes,CONCEPT,CONCEPT_ID,Measurement,NA,NA +measurement,measurement_concept_id,Yes,integer,"The MEASUREMENT_CONCEPT_ID field is recommended for primary use in analyses, and must be used for network studies. This is the standard concept mapped from the source value which represents a measurement.",The CONCEPT_ID that the MEASUREMENT_SOURCE_VALUE maps to. Only records whose source values map to concepts with a domain of �Measurement� should go in this table.,No,Yes,CONCEPT,CONCEPT_ID,Measurement,NA,NA measurement,measurement_date,Yes,date,Use this date to determine the date of the measurement.,"If there are multiple dates in the source data associated with a record such as order_date, draw_date, and result_date, choose the one that is closest to the date the sample was drawn from the patient.",No,No,NA,NA,NA,NA,NA measurement,measurement_datetime,No,datetime,NA,"This is not required, though it is in v6. If a source does not specify datetime the convention is to set the time to midnight (00:00:0000)",No,No,NA,NA,NA,NA,NA measurement,measurement_time,No,varchar(10),NA,This is present for backwards compatibility and will be deprecated in an upcoming version.,No,No,NA,NA,NA,NA,NA From af17663f67c3379d107c974660bd16086a3980e2 Mon Sep 17 00:00:00 2001 From: Mark Wardle Date: Sun, 9 Jun 2024 21:58:29 +0100 Subject: [PATCH 13/39] Standardise case of integer datatype The CDM datatype column uses a mixture of 'integer' and 'Integer'. All other datatypes only use lowercase. --- inst/csv/OMOP_CDMv5.4_Field_Level.csv | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/inst/csv/OMOP_CDMv5.4_Field_Level.csv b/inst/csv/OMOP_CDMv5.4_Field_Level.csv index 9c061b8..733ad58 100644 --- a/inst/csv/OMOP_CDMv5.4_Field_Level.csv +++ b/inst/csv/OMOP_CDMv5.4_Field_Level.csv @@ -35,7 +35,7 @@ visit_occurrence,visit_end_date,Yes,date,"For inpatient visits the end date is t For Inpatient Visits ongoing at the date of ETL, put date of processing the data into visit_end_datetime and visit_type_concept_id with 32220 ""Still patient"" to identify the visit as incomplete. - All other Visits: visit_end_datetime = visit_start_datetime. If this is a one-day visit the end date should match the start date.",No,No,NA,NA,NA,NA,NA visit_occurrence,visit_end_datetime,No,datetime,"If a Person is still an inpatient in the hospital at the time of the data extract and does not have a visit_end_datetime, then set the visit_end_datetime to the datetime of the data pull.","If no time is given for the end date of a visit, set it to midnight (00:00:0000).",No,No,NA,NA,NA,NA,NA -visit_occurrence,visit_type_concept_id,Yes,Integer,"Use this field to understand the provenance of the visit record, or where the record comes from.","Populate this field based on the provenance of the visit record, as in whether it came from an EHR record or billing claim. [Accepted Concepts](https://athena.ohdsi.org/search-terms/terms?domain=Type+Concept&standardConcept=Standard&page=1&pageSize=15&query=). A more detailed explanation of each Type Concept can be found on the [vocabulary wiki](https://github.com/OHDSI/Vocabulary-v5.0/wiki/Vocab.-TYPE_CONCEPT).",No,Yes,CONCEPT,CONCEPT_ID,Type Concept,NA,NA +visit_occurrence,visit_type_concept_id,Yes,integer,"Use this field to understand the provenance of the visit record, or where the record comes from.","Populate this field based on the provenance of the visit record, as in whether it came from an EHR record or billing claim. [Accepted Concepts](https://athena.ohdsi.org/search-terms/terms?domain=Type+Concept&standardConcept=Standard&page=1&pageSize=15&query=). A more detailed explanation of each Type Concept can be found on the [vocabulary wiki](https://github.com/OHDSI/Vocabulary-v5.0/wiki/Vocab.-TYPE_CONCEPT).",No,Yes,CONCEPT,CONCEPT_ID,Type Concept,NA,NA visit_occurrence,provider_id,No,integer,"There will only be one provider per visit record and the ETL document should clearly state how they were chosen (attending, admitting, etc.). If there are multiple providers associated with a visit in the source, this can be reflected in the event tables (CONDITION_OCCURRENCE, PROCEDURE_OCCURRENCE, etc.) or in the VISIT_DETAIL table.","If there are multiple providers associated with a visit, you will need to choose which one to put here. The additional providers can be stored in the [VISIT_DETAIL](https://ohdsi.github.io/CommonDataModel/cdm531.html#visit_detail) table.",No,Yes,PROVIDER,PROVIDER_ID,NA,NA,NA visit_occurrence,care_site_id,No,integer,This field provides information about the Care Site where the Visit took place.,There should only be one Care Site associated with a Visit.,No,Yes,CARE_SITE,CARE_SITE_ID,NA,NA,NA visit_occurrence,visit_source_value,No,varchar(50),"This field houses the verbatim value from the source data representing the kind of visit that took place (inpatient, outpatient, emergency, etc.)","If there is information about the kind of visit in the source data that value should be stored here. If a visit is an amalgamation of visits from the source then use a hierarchy to choose the visit source value, such as IP -> ER-> OP. This should line up with the logic chosen to determine how visits are created.",No,No,NA,NA,NA,NA,NA @@ -62,8 +62,8 @@ visit_detail,visit_detail_type_concept_id,Yes,integer,"Use this field to underst visit_detail,provider_id,No,integer,"There will only be one provider per **visit** record and the ETL document should clearly state how they were chosen (attending, admitting, etc.). This is a typical reason for leveraging the VISIT_DETAIL table as even though each VISIT_DETAIL record can only have one provider, there is no limit to the number of VISIT_DETAIL records that can be associated to a VISIT_OCCURRENCE record.",The additional providers associated to a Visit can be stored in this table where each VISIT_DETAIL record represents a different provider.,No,Yes,PROVIDER,PROVIDER_ID,NA,NA,NA visit_detail,care_site_id,No,integer,This field provides information about the Care Site where the Visit Detail took place.,There should only be one Care Site associated with a Visit Detail.,No,Yes,CARE_SITE,CARE_SITE_ID,NA,NA,NA visit_detail,visit_detail_source_value,No,varchar(50),"This field houses the verbatim value from the source data representing the kind of visit detail that took place (inpatient, outpatient, emergency, etc.)","If there is information about the kind of visit detail in the source data that value should be stored here. If a visit is an amalgamation of visits from the source then use a hierarchy to choose the VISIT_DETAIL_SOURCE_VALUE, such as IP -> ER-> OP. This should line up with the logic chosen to determine how visits are created.",No,No,NA,NA,NA,NA,NA -visit_detail,visit_detail_source_concept_id,No,Integer,NA,If the VISIT_DETAIL_SOURCE_VALUE is coded in the source data using an OMOP supported vocabulary put the concept id representing the source value here.,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA -visit_detail,admitted_from_concept_id,No,Integer,"Use this field to determine where the patient was admitted from. This concept is part of the visit domain and can indicate if a patient was admitted to the hospital from a long-term care facility, for example.","If available, map the admitted_from_source_value to a standard concept in the visit domain. [Accepted Concepts](https://athena.ohdsi.org/search-terms/terms?domain=Visit&standardConcept=Standard&page=1&pageSize=15&query=). If a person was admitted from home or was self-referred, set this to 0.",No,Yes,CONCEPT,CONCEPT_ID,Visit,NA,NA +visit_detail,visit_detail_source_concept_id,No,integer,NA,If the VISIT_DETAIL_SOURCE_VALUE is coded in the source data using an OMOP supported vocabulary put the concept id representing the source value here.,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA +visit_detail,admitted_from_concept_id,No,integer,"Use this field to determine where the patient was admitted from. This concept is part of the visit domain and can indicate if a patient was admitted to the hospital from a long-term care facility, for example.","If available, map the admitted_from_source_value to a standard concept in the visit domain. [Accepted Concepts](https://athena.ohdsi.org/search-terms/terms?domain=Visit&standardConcept=Standard&page=1&pageSize=15&query=). If a person was admitted from home or was self-referred, set this to 0.",No,Yes,CONCEPT,CONCEPT_ID,Visit,NA,NA visit_detail,admitted_from_source_value,No,varchar(50),NA,"This information may be called something different in the source data but the field is meant to contain a value indicating where a person was admitted from. Typically this applies only to visits that have a length of stay, like inpatient visits or long-term care visits.",No,No,NA,NA,NA,NA,NA visit_detail,discharged_to_source_value,No,varchar(50),NA,"This information may be called something different in the source data but the field is meant to contain a value indicating where a person was discharged to after a visit, as in they went home or were moved to long-term care. Typically this applies only to visits that have a length of stay of a day or more.",No,No,NA,NA,NA,NA,NA visit_detail,discharged_to_concept_id,No,integer,"Use this field to determine where the patient was discharged to after a visit. This concept is part of the visit domain and can indicate if a patient was transferred to another hospital or sent to a long-term care facility, for example. It is assumed that a person is discharged to home therefore there is not a standard concept id for ""home"". Use concept id = 0 when a person is discharged to home.","If available, map the DISCHARGE_TO_SOURCE_VALUE to a Standard Concept in the Visit domain. [Accepted Concepts](https://athena.ohdsi.org/search-terms/terms?domain=Visit&standardConcept=Standard&page=1&pageSize=15&query=).",No,Yes,CONCEPT,CONCEPT_ID,Visit,NA,NA @@ -177,7 +177,7 @@ observation,observation_datetime,No,datetime,NA,If no time is given set to midni observation,observation_type_concept_id,Yes,integer,"This field can be used to determine the provenance of the Observation record, as in whether the measurement was from an EHR system, insurance claim, registry, or other sources.","Choose the OBSERVATION_TYPE_CONCEPT_ID that best represents the provenance of the record, for example whether it came from an EHR record or billing claim. [Accepted Concepts](https://athena.ohdsi.org/search-terms/terms?domain=Type+Concept&standardConcept=Standard&page=1&pageSize=15&query=). A more detailed explanation of each Type Concept can be found on the [vocabulary wiki](https://github.com/OHDSI/Vocabulary-v5.0/wiki/Vocab.-TYPE_CONCEPT).",No,Yes,CONCEPT,CONCEPT_ID,Type Concept,NA,NA observation,value_as_number,No,float,"This is the numerical value of the Result of the Observation, if applicable and available. It is not expected that all Observations will have numeric results, rather, this field is here to house values should they exist.",NA,No,No,NA,NA,NA,NA,NA observation,value_as_string,No,varchar(60),"This is the categorical value of the Result of the Observation, if applicable and available.",NA,No,No,NA,NA,NA,NA,NA -observation,value_as_concept_id,No,Integer,"It is possible that some records destined for the Observation table have two clinical ideas represented in one source code. This is common with ICD10 codes that describe a family history of some Condition, for example. In OMOP the Vocabulary breaks these two clinical ideas into two codes; one becomes the OBSERVATION_CONCEPT_ID and the other becomes the VALUE_AS_CONCEPT_ID. It is important when using the Observation table to keep this possibility in mind and to examine the VALUE_AS_CONCEPT_ID field for relevant information.","Note that the value of VALUE_AS_CONCEPT_ID may be provided through mapping from a source Concept which contains the content of the Observation. In those situations, the CONCEPT_RELATIONSHIP table in addition to the 'Maps to' record contains a second record with the relationship_id set to 'Maps to value'. For example, ICD10 [Z82.4](https://athena.ohdsi.org/search-terms/terms/45581076) 'Family history of ischaemic heart disease and other diseases of the circulatory system' has a 'Maps to' relationship to [4167217](https://athena.ohdsi.org/search-terms/terms/4167217) 'Family history of clinical finding' as well as a 'Maps to value' record to [134057](https://athena.ohdsi.org/search-terms/terms/134057) 'Disorder of cardiovascular system'. If there's no categorial result in a source_data, set value_as_concept_id to NULL, if there is a categorial result in a source_data but without mapping, set value_as_concept_id to 0.",No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA +observation,value_as_concept_id,No,integer,"It is possible that some records destined for the Observation table have two clinical ideas represented in one source code. This is common with ICD10 codes that describe a family history of some Condition, for example. In OMOP the Vocabulary breaks these two clinical ideas into two codes; one becomes the OBSERVATION_CONCEPT_ID and the other becomes the VALUE_AS_CONCEPT_ID. It is important when using the Observation table to keep this possibility in mind and to examine the VALUE_AS_CONCEPT_ID field for relevant information.","Note that the value of VALUE_AS_CONCEPT_ID may be provided through mapping from a source Concept which contains the content of the Observation. In those situations, the CONCEPT_RELATIONSHIP table in addition to the 'Maps to' record contains a second record with the relationship_id set to 'Maps to value'. For example, ICD10 [Z82.4](https://athena.ohdsi.org/search-terms/terms/45581076) 'Family history of ischaemic heart disease and other diseases of the circulatory system' has a 'Maps to' relationship to [4167217](https://athena.ohdsi.org/search-terms/terms/4167217) 'Family history of clinical finding' as well as a 'Maps to value' record to [134057](https://athena.ohdsi.org/search-terms/terms/134057) 'Disorder of cardiovascular system'. If there's no categorial result in a source_data, set value_as_concept_id to NULL, if there is a categorial result in a source_data but without mapping, set value_as_concept_id to 0.",No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA observation,qualifier_concept_id,No,integer,"This field contains all attributes specifying the clinical fact further, such as as degrees, severities, drug-drug interaction alerts etc.","Use your best judgement as to what Concepts to use here and if they are necessary to accurately represent the clinical record. There is no restriction on the domain of these Concepts, they just need to be Standard.",No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA observation,unit_concept_id,No,integer,There is currently no recommended unit for individual observation concepts. UNIT_SOURCE_VALUES should be mapped to a Standard Concept in the Unit domain that best represents the unit as given in the source data.,"There is no standardization requirement for units associated with OBSERVATION_CONCEPT_IDs, however, it is the responsibility of the ETL to choose the most plausible unit. If the source unit is NULL (applicable to cases when there's no numerical value or when it doesn't require a unit), keep unit_concept_id NULL as well. If there's no mapping of a source unit, populate unit_concept_id with 0.",No,Yes,CONCEPT,CONCEPT_ID,Unit,NA,NA observation,provider_id,No,integer,"The provider associated with the observation record, e.g. the provider who ordered the test or the provider who recorded the result.",The ETL may need to make a choice as to which PROVIDER_ID to put here. Based on what is available this may or may not be different than the provider associated with the overall VISIT_OCCURRENCE record. For example the admitting vs attending physician on an EHR record.,No,Yes,PROVIDER,PROVIDER_ID,NA,NA,NA @@ -548,4 +548,4 @@ cohort_definition,cohort_definition_description,No,varchar(MAX),A complete descr cohort_definition,definition_type_concept_id,Yes,integer,Type defining what kind of Cohort Definition the record represents and how the syntax may be executed.,NA,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA cohort_definition,cohort_definition_syntax,No,varchar(MAX),Syntax or code to operationalize the Cohort Definition.,NA,No,No,NA,NA,NA,NA,NA cohort_definition,subject_concept_id,Yes,integer,"This field contains a Concept that represents the domain of the subjects that are members of the cohort (e.g., Person, Provider, Visit).",NA,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA -cohort_definition,cohort_initiation_date,No,date,A date to indicate when the Cohort was initiated in the COHORT table.,NA,No,No,NA,NA,NA,NA,NA \ No newline at end of file +cohort_definition,cohort_initiation_date,No,date,A date to indicate when the Cohort was initiated in the COHORT table.,NA,No,No,NA,NA,NA,NA,NA From abe75876ae0222c92e48d9a6bc5b2566e2765bc8 Mon Sep 17 00:00:00 2001 From: Maxim Moinat Date: Fri, 14 Jun 2024 16:11:28 +0200 Subject: [PATCH 14/39] render cdm specs --- docs/cdm53.html | 19 +-- docs/cdm54.html | 19 +-- inst/csv/OMOP_CDMv6.0_Field_Level.csv | 228 +++++++++++++------------- 3 files changed, 118 insertions(+), 148 deletions(-) diff --git a/docs/cdm53.html b/docs/cdm53.html index 577752b..1172650 100644 --- a/docs/cdm53.html +++ b/docs/cdm53.html @@ -3552,23 +3552,8 @@ the patient. If this information is not explicitly available in the data, infer the -end date using the following methods:

1. Start first with -duration or days supply using the calculation drug start date + days -supply -1 day. 2. Use quantity divided by daily dose that you may obtain -from the sig or a source field (or assumed daily dose of 1) for solid, -indivisibile, drug products. If quantity represents ingredient amount, -quantity divided by daily dose * concentration (from drug_strength) drug -concept id tells you the dose form. 3. If it is an administration -record, set drug end date equal to drug start date. If the record is a -written prescription then set end date to start date + 29. If the record -is a mail-order prescription set end date to start date + 89. The end -date must be equal to or greater than the start date. Ibuprofen 20mg/mL -oral solution concept tells us this is oral solution. Calculate duration -as quantity (200 example) * daily dose (5mL) /concentration (20mg/mL) -200*5/20 = 50 days. Examples -by dose form

For detailed conventions for how to populate -this field, please see the For detailed conventions for +how to populate this field, please see the THEMIS repository. diff --git a/docs/cdm54.html b/docs/cdm54.html index e705e60..930f791 100644 --- a/docs/cdm54.html +++ b/docs/cdm54.html @@ -3676,23 +3676,8 @@ the patient. If this information is not explicitly available in the data, infer the -end date using the following methods:

1. Start first with -duration or days supply using the calculation drug start date + days -supply -1 day. 2. Use quantity divided by daily dose that you may obtain -from the sig or a source field (or assumed daily dose of 1) for solid, -indivisibile, drug products. If quantity represents ingredient amount, -quantity divided by daily dose * concentration (from drug_strength) drug -concept id tells you the dose form. 3. If it is an administration -record, set drug end date equal to drug start date. If the record is a -written prescription then set end date to start date + 29. If the record -is a mail-order prescription set end date to start date + 89. The end -date must be equal to or greater than the start date. Ibuprofen 20mg/mL -oral solution concept tells us this is oral solution. Calculate duration -as quantity (200 example) * daily dose (5mL) /concentration (20mg/mL) -200*5/20 = 50 days. Examples -by dose form

For detailed conventions for how to populate -this field, please see the For detailed conventions for +how to populate this field, please see the THEMIS repository. diff --git a/inst/csv/OMOP_CDMv6.0_Field_Level.csv b/inst/csv/OMOP_CDMv6.0_Field_Level.csv index a5c2708..c43adc5 100644 --- a/inst/csv/OMOP_CDMv6.0_Field_Level.csv +++ b/inst/csv/OMOP_CDMv6.0_Field_Level.csv @@ -28,12 +28,12 @@ visit_occurrence,person_id,Yes,bigint,NA,NA,No,Yes,PERSON,PERSON_ID,NA,NA,NA visit_occurrence,visit_concept_id,Yes,integer,"This field contains a concept id representing the kind of visit, like inpatient or outpatient. All concepts in this field should be standard and belong to the Visit domain.","Populate this field based on the kind of visit that took place for the person. For example this could be ""Inpatient Visit"", ""Outpatient Visit"", ""Ambulatory Visit"", etc. This table will contain standard concepts in the Visit domain. These concepts are arranged in a hierarchical structure to facilitate cohort definitions by rolling up to generally familiar Visits adopted in most healthcare systems worldwide.",No,Yes,CONCEPT,CONCEPT_ID,Visit,NA,NA visit_occurrence,visit_start_date,No,date,"For inpatient visits, the start date is typically the admission date. For outpatient visits the start date and end date will be the same.","When populating visit_start_date, you should think about the patient experience to make decisions on how to define visits. In the case of an inpatient visit this should be the date the patient was admitted to the hospital or institution. In all other cases this should be the date of the patient-provider interaction.",No,No,NA,NA,NA,NA,NA visit_occurrence,visit_start_datetime,Yes,datetime,NA,"If no time is given for the start date of a visit, set it to midnight (00:00:0000).",No,No,NA,NA,NA,NA,NA -visit_occurrence,visit_end_date,No,date,For inpatient visits the end date is typically the discharge date.,"Visit end dates are mandatory. If end dates are not provided in the source there are three ways in which to derive them: -Outpatient Visit: visit_end_datetime = visit_start_datetime -Emergency Room Visit: visit_end_datetime = visit_start_datetime -Inpatient Visit: Usually there is information about discharge. If not, you should be able to derive the end date from the sudden decline of activity or from the absence of inpatient procedures/drugs. -Non-hospital institution Visits: Particularly for claims data, if end dates are not provided assume the visit is for the duration of month that it occurs. -For Inpatient Visits ongoing at the date of ETL, put date of processing the data into visit_end_datetime and visit_type_concept_id with 32220 ""Still patient"" to identify the visit as incomplete. +visit_occurrence,visit_end_date,No,date,For inpatient visits the end date is typically the discharge date.,"Visit end dates are mandatory. If end dates are not provided in the source there are three ways in which to derive them: +Outpatient Visit: visit_end_datetime = visit_start_datetime +Emergency Room Visit: visit_end_datetime = visit_start_datetime +Inpatient Visit: Usually there is information about discharge. If not, you should be able to derive the end date from the sudden decline of activity or from the absence of inpatient procedures/drugs. +Non-hospital institution Visits: Particularly for claims data, if end dates are not provided assume the visit is for the duration of month that it occurs. +For Inpatient Visits ongoing at the date of ETL, put date of processing the data into visit_end_datetime and visit_type_concept_id with 32220 ""Still patient"" to identify the visit as incomplete. All other Visits: visit_end_datetime = visit_start_datetime. If this is a one-day visit the end date should match the start date.",No,No,NA,NA,NA,NA,NA visit_occurrence,visit_end_datetime,Yes,datetime,NA,"If no time is given for the end date of a visit, set it to midnight (00:00:0000).",No,No,NA,NA,NA,NA,NA visit_occurrence,visit_type_concept_id,Yes,Integer,"Use this field to understand the provenance of the visit record, or where the record comes from.","Populate this field based on the provenance of the visit record, as in whether it came from an EHR record or billing claim.",No,Yes,CONCEPT,CONCEPT_ID,Type Concept,NA,NA @@ -51,12 +51,12 @@ visit_detail,person_id,Yes,bigint,NA,NA,No,Yes,PERSON,PERSON_ID,NA,NA,NA visit_detail,visit_detail_concept_id,Yes,integer,"This field contains a concept id representing the kind of visit detail, like inpatient or outpatient. All concepts in this field should be standard and belong to the Visit domain.","Populate this field based on the kind of visit that took place for the person. For example this could be ""Inpatient Visit"", ""Outpatient Visit"", ""Ambulatory Visit"", etc. This table will contain standard concepts in the Visit domain. These concepts are arranged in a hierarchical structure to facilitate cohort definitions by rolling up to generally familiar Visits adopted in most healthcare systems worldwide. [Accepted Concepts](https://athena.ohdsi.org/search-terms/terms?domain=Visit&standardConcept=Standard&page=1&pageSize=15&query=).",No,Yes,CONCEPT,CONCEPT_ID,Visit,NA,NA visit_detail,visit_detail_start_date,Yes,date,This is the date of the start of the encounter. This may or may not be equal to the date of the Visit the Visit Detail is associated with.,"When populating visit_start_date, you should think about the patient experience to make decisions on how to define visits. Most likely this should be the date of the patient-provider interaction.",No,No,NA,NA,NA,NA,NA visit_detail,visit_detail_start_datetime,No,datetime,NA,"If no time is given for the start date of a visit, set it to midnight (00:00:0000).",No,No,NA,NA,NA,NA,NA -visit_detail,visit_detail_end_date,Yes,date,This the end date of the patient-provider interaction.,"Visit Detail end dates are mandatory. If end dates are not provided in the source there are three ways in which to derive them:
-- Outpatient Visit Detail: visit_detail_end_datetime = visit_detail_start_datetime -- Emergency Room Visit Detail: visit_detail_end_datetime = visit_detail_start_datetime -- Inpatient Visit Detail: Usually there is information about discharge. If not, you should be able to derive the end date from the sudden decline of activity or from the absence of inpatient procedures/drugs. -- Non-hospital institution Visit Details: Particularly for claims data, if end dates are not provided assume the visit is for the duration of month that it occurs.
-For Inpatient Visit Details ongoing at the date of ETL, put date of processing the data into visit_detai_end_datetime and visit_detail_type_concept_id with 32220 ""Still patient"" to identify the visit as incomplete. +visit_detail,visit_detail_end_date,Yes,date,This the end date of the patient-provider interaction.,"Visit Detail end dates are mandatory. If end dates are not provided in the source there are three ways in which to derive them:
+- Outpatient Visit Detail: visit_detail_end_datetime = visit_detail_start_datetime +- Emergency Room Visit Detail: visit_detail_end_datetime = visit_detail_start_datetime +- Inpatient Visit Detail: Usually there is information about discharge. If not, you should be able to derive the end date from the sudden decline of activity or from the absence of inpatient procedures/drugs. +- Non-hospital institution Visit Details: Particularly for claims data, if end dates are not provided assume the visit is for the duration of month that it occurs.
+For Inpatient Visit Details ongoing at the date of ETL, put date of processing the data into visit_detai_end_datetime and visit_detail_type_concept_id with 32220 ""Still patient"" to identify the visit as incomplete. All other Visits Details: visit_detail_end_datetime = visit_detail_start_datetime.",No,No,NA,NA,NA,NA,NA visit_detail,visit_detail_end_datetime,No,datetime,NA,"If no time is given for the end date of a visit, set it to midnight (00:00:0000).",No,No,NA,NA,NA,NA,NA visit_detail,visit_detail_type_concept_id,Yes,Integer,"Use this field to understand the provenance of the visit detail record, or where the record comes from.","Populate this field based on the provenance of the visit detail record, as in whether it came from an EHR record or billing claim. [Accepted Concepts](https://athena.ohdsi.org/search-terms/terms?domain=Type+Concept&standardConcept=Standard&page=1&pageSize=15&query=).",No,Yes,CONCEPT,CONCEPT_ID,Type Concept,NA,NA @@ -92,14 +92,14 @@ drug_exposure,person_id,Yes,bigint,The PERSON_ID of the PERSON for whom the drug drug_exposure,drug_concept_id,Yes,integer,"The DRUG_CONCEPT_ID field is recommended for primary use in analyses, and must be used for network studies. This is the standard concept mapped from the source concept id which represents a drug product or molecule otherwise introduced to the body. The drug concepts can have a varying degree of information about drug strength and dose. This information is relevant in the context of quantity and administration information in the subsequent fields plus strength information from the DRUG_STRENGTH table, provided as part of the standard vocabulary download.","The CONCEPT_ID that the DRUG_SOURCE_VALUE maps to. The concept id should be derived either from mapping from the source concept id or by picking the drug concept representing the most amount of detail you have. Records whose source values map to standard concepts with a domain of Drug should go in this table. When the Drug Source Value of the code cannot be translated into Standard Drug Concept IDs, a Drug exposure entry is stored with only the corresponding SOURCE_CONCEPT_ID and DRUG_SOURCE_VALUE and a DRUG_CONCEPT_ID of 0. The Drug Concept with the most detailed content of information is preferred during the mapping process. These are indicated in the CONCEPT_CLASS_ID field of the Concept and are recorded in the following order of precedence: 'Branded Pack', 'Clinical Pack', 'Branded Drug', 'Clinical Drug', 'Branded Drug Component', 'Clinical Drug Component', 'Branded Drug Form', 'Clinical Drug Form', and only if no other information is available 'Ingredient'. Note: If only the drug class is known, the DRUG_CONCEPT_ID field should contain 0. [Accepted Concepts](https://athena.ohdsi.org/search-terms/terms?domain=Drug&standardConcept=Standard&page=1&pageSize=15&query=).",No,Yes,CONCEPT,CONCEPT_ID,Drug,NA,NA drug_exposure,drug_exposure_start_date,Yes,date,Use this date to determine the start date of the drug record.,"Valid entries include a start date of a prescription, the date a prescription was filled, or the date on which a Drug administration was recorded. It is a valid ETL choice to use the date the drug was ordered as the DRUG_EXPOSURE_START_DATE.",No,No,NA,NA,NA,NA,NA drug_exposure,drug_exposure_start_datetime,No,datetime,NA,"This is not required, though it is in v6. If a source does not specify datetime the convention is to set the time to midnight (00:00:0000)",No,No,NA,NA,NA,NA,NA -drug_exposure,drug_exposure_end_date,Yes,date,The DRUG_EXPOSURE_END_DATE denotes the day the drug exposure ended for the patient.,"If this information is not explicitly available in the data, infer the end date using the following methods:/n/n 1. Start first with duration or days supply using the calculation drug start date + days supply -1 day. 2. Use quantity divided by daily dose that you may obtain from the sig or a source field (or assumed daily dose of 1) for solid, indivisibile, drug products. If quantity represents ingredient amount, quantity divided by daily dose * concentration (from drug_strength) drug concept id tells you the dose form. 3. If it is an administration record, set drug end date equal to drug start date. If the record is a written prescription then set end date to start date + 29. If the record is a mail-order prescription set end date to start date + 89. The end date must be equal to or greater than the start date. Ibuprofen 20mg/mL oral solution concept tells us this is oral solution. Calculate duration as quantity (200 example) * daily dose (5mL) /concentration (20mg/mL) 200*5/20 = 50 days. [Examples by dose form](https://ohdsi.github.io/CommonDataModel/drug_dose.html)",No,No,NA,NA,NA,NA,NA +drug_exposure,drug_exposure_end_date,Yes,date,The DRUG_EXPOSURE_END_DATE denotes the day the drug exposure ended for the patient.,"If this information is not explicitly available in the data, infer the end date from start date and duration.
For detailed conventions for how to populate this field, please see the [THEMIS repository](https://ohdsi.github.io/Themis/tag_drug_exposure.html).",No,No,NA,NA,NA,NA,NA drug_exposure,drug_exposure_end_datetime,No,datetime,NA,"This is not required, though it is in v6. If a source does not specify datetime the convention is to set the time to midnight (00:00:0000)",No,No,NA,NA,NA,NA,NA drug_exposure,verbatim_end_date,No,date,"This is the end date of the drug exposure as it appears in the source data, if it is given",Put the end date or discontinuation date as it appears from the source data or leave blank if unavailable.,No,No,NA,NA,NA,NA,NA drug_exposure,drug_type_concept_id,Yes,integer,"You can use the TYPE_CONCEPT_ID to delineate between prescriptions written vs. prescriptions dispensed vs. medication history vs. patient-reported exposure, etc.","Choose the drug_type_concept_id that best represents the provenance of the record, for example whether it came from a record of a prescription written or physician administered drug. [Accepted Concepts](https://athena.ohdsi.org/search-terms/terms?domain=Type+Concept&standardConcept=Standard&page=1&pageSize=15&query=).",No,Yes,CONCEPT,CONCEPT_ID,Type Concept,NA,NA drug_exposure,stop_reason,No,varchar(20),"The reason a person stopped a medication as it is represented in the source. Reasons include regimen completed, changed, removed, etc. This field will be retired in v6.0.",This information is often not populated in source data and it is a valid etl choice to leave it blank if the information does not exist.,No,No,NA,NA,NA,NA,NA drug_exposure,refills,No,integer,This is only filled in when the record is coming from a prescription written this field is meant to represent intended refills at time of the prescription.,NA,No,No,NA,NA,NA,NA,NA -drug_exposure,quantity,No,float,NA,"To find the dose form of a drug the RELATIONSHIP table can be used where the relationship_id is 'Has dose form'. If liquid, quantity stands for the total amount dispensed or ordered of ingredient in the units given by the drug_strength table. If the unit from the source data does not align with the unit in the DRUG_STRENGTH table the quantity should be converted to the correct unit given in DRUG_STRENGTH. For clinical drugs with fixed dose forms (tablets etc.) the quantity is the number of units/tablets/capsules prescribed or dispensed (can be partial, but then only 1/2 or 1/3, not 0.01). Clinical drugs with divisible dose forms (injections) the quantity is the amount of ingredient the patient got. For example, if the injection is 2mg/mL but the patient got 80mL then quantity is reported as 160. -Quantified clinical drugs with divisible dose forms (prefilled syringes), the quantity is the amount of ingredient similar to clinical drugs. Please see [how to calculate drug dose](https://ohdsi.github.io/CommonDataModel/drug_dose.html) for more information. +drug_exposure,quantity,No,float,NA,"To find the dose form of a drug the RELATIONSHIP table can be used where the relationship_id is 'Has dose form'. If liquid, quantity stands for the total amount dispensed or ordered of ingredient in the units given by the drug_strength table. If the unit from the source data does not align with the unit in the DRUG_STRENGTH table the quantity should be converted to the correct unit given in DRUG_STRENGTH. For clinical drugs with fixed dose forms (tablets etc.) the quantity is the number of units/tablets/capsules prescribed or dispensed (can be partial, but then only 1/2 or 1/3, not 0.01). Clinical drugs with divisible dose forms (injections) the quantity is the amount of ingredient the patient got. For example, if the injection is 2mg/mL but the patient got 80mL then quantity is reported as 160. +Quantified clinical drugs with divisible dose forms (prefilled syringes), the quantity is the amount of ingredient similar to clinical drugs. Please see [how to calculate drug dose](https://ohdsi.github.io/CommonDataModel/drug_dose.html) for more information. ",No,No,NA,NA,NA,NA,NA drug_exposure,days_supply,No,integer,The number of days of supply of the medication as recorded in the original prescription or dispensing record. Days supply can differ from actual drug duration (i.e. prescribed days supply vs actual exposure).,"The field should be left empty if the source data does not contain a verbatim days_supply, and should not be calculated from other fields. Negative values are not allowed. Several actions are possible: 1) record is not trustworthy and we remove the record entirely. 2) we trust the record and leave days_supply empty or 3) record needs to be combined with other record (e.g. reversal of prescription). High values (>365 days) should be investigated. If considered an error in the source data (e.g. typo), the value needs to be excluded to prevent creation of unrealistic long eras.",No,No,NA,NA,NA,NA,NA drug_exposure,sig,No,varchar(MAX),This is the verbatim instruction for the drug as written by the provider.,"Put the written out instructions for the drug as it is verbatim in the source, if available.",No,No,NA,NA,NA,NA,NA @@ -196,7 +196,7 @@ note,note_event_field_concept_id,No,integer,NA,NA,No,Yes,CONCEPT,CONCEPT_ID,NA,N note,note_date,Yes,date,The date the note was recorded.,NA,No,No,NA,NA,NA,NA,NA note,note_datetime,No,datetime,NA,If time is not given set the time to midnight.,No,No,NA,NA,NA,NA,NA note,note_type_concept_id,Yes,integer,The provenance of the note. Most likely this will be EHR.,"Put the source system of the note, as in EHR record. [Accepted Concepts](https://athena.ohdsi.org/search-terms/terms?standardConcept=Standard&domain=Type+Concept&page=1&pageSize=15&query=).",No,Yes,CONCEPT,CONCEPT_ID,Type Concept,NA,NA -note,note_class_concept_id,Yes,integer,"A Standard Concept Id representing the HL7 LOINC +note,note_class_concept_id,Yes,integer,"A Standard Concept Id representing the HL7 LOINC Document Type Vocabulary classification of the note.",Map the note classification to a Standard Concept. For more information see the ETL Conventions in the description of the NOTE table. [AcceptedConcepts](https://athena.ohdsi.org/search-terms/terms?standardConcept=Standard&conceptClass=Doc+Kind&conceptClass=Doc+Role&conceptClass=Doc+Setting&conceptClass=Doc+Subject+Matter&conceptClass=Doc+Type+of+Service&domain=Meas+Value&page=1&pageSize=15&query=). This Concept can alternatively be represented by concepts with the relationship 'Kind of (LOINC)' to [706391](https://athena.ohdsi.org/search-terms/terms/706391) (Note).,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA note,note_title,No,varchar(250),The title of the note.,NA,No,No,NA,NA,NA,NA,NA note,note_text,Yes,varchar(MAX),The content of the note.,NA,No,No,NA,NA,NA,NA,NA @@ -217,22 +217,22 @@ note_nlp,note_nlp_source_concept_id,No,integer,NA,NA,No,Yes,CONCEPT,CONCEPT_ID,N note_nlp,nlp_system,No,varchar(250),NA,Name and version of the NLP system that extracted the term. Useful for data provenance.,No,No,NA,NA,NA,NA,NA note_nlp,nlp_date,Yes,date,The date of the note processing.,NA,No,No,NA,NA,NA,NA,NA note_nlp,nlp_datetime,No,datetime,The date and time of the note processing.,NA,No,No,NA,NA,NA,NA,NA -note_nlp,term_exists,No,varchar(1),NA,"Term_exists is defined as a flag that indicates if the patient actually has or had the condition. Any of the following modifiers would make Term_exists false: -Negation = true -Subject = [anything other than the patient] -Conditional = true/li> -Rule_out = true -Uncertain = very low certainty or any lower certainties -A complete lack of modifiers would make Term_exists true. +note_nlp,term_exists,No,varchar(1),NA,"Term_exists is defined as a flag that indicates if the patient actually has or had the condition. Any of the following modifiers would make Term_exists false: +Negation = true +Subject = [anything other than the patient] +Conditional = true/li> +Rule_out = true +Uncertain = very low certainty or any lower certainties +A complete lack of modifiers would make Term_exists true. ",No,No,NA,NA,NA,NA,NA -note_nlp,term_temporal,No,varchar(50),NA,"Term_temporal is to indicate if a condition is present or just in the past. The following would be past:

-- History = true +note_nlp,term_temporal,No,varchar(50),NA,"Term_temporal is to indicate if a condition is present or just in the past. The following would be past:

+- History = true - Concept_date = anything before the time of the report",No,No,NA,NA,NA,NA,NA -note_nlp,term_modifiers,No,varchar(2000),NA,"For the modifiers that are there, they would have to have these values:

-- Negation = false -- Subject = patient -- Conditional = false -- Rule_out = false +note_nlp,term_modifiers,No,varchar(2000),NA,"For the modifiers that are there, they would have to have these values:

+- Negation = false +- Subject = patient +- Conditional = false +- Rule_out = false - Uncertain = true or high or moderate or even low (could argue about low). Term_modifiers will concatenate all modifiers for different types of entities (conditions, drugs, labs etc) into one string. Lab values will be saved as one of the modifiers.",No,No,NA,NA,NA,NA,NA specimen,specimen_id,Yes,bigint,Unique identifier for each specimen.,NA,Yes,No,NA,NA,NA,NA,NA specimen,person_id,Yes,bigint,The person from whom the specimen is collected.,NA,No,Yes,PERSON,PERSON_ID,NA,NA,NA @@ -356,9 +356,9 @@ drug_era,drug_era_id,Yes,bigint,NA,NA,Yes,No,NA,NA,NA,NA,NA drug_era,person_id,Yes,bigint,NA,NA,No,Yes,PERSON,PERSON_ID,NA,NA,NA drug_era,drug_concept_id,Yes,integer,The Concept Id representing the specific drug ingredient.,NA,No,Yes,CONCEPT,CONCEPT_ID,Drug,Ingredient,NA drug_era,drug_era_start_datetime,Yes,datetime,NA,"The Drug Era Start Date is the start date of the first Drug Exposure for a given ingredient, with at least 31 days since the previous exposure.",No,No,NA,NA,NA,NA,NA -drug_era,drug_era_end_datetime,Yes,datetime,NA,"The Drug Era End Date is the end date of the last Drug Exposure. The End Date of each Drug Exposure is either taken from the field drug_exposure_end_date or, as it is typically not available, inferred using the following rules: -For pharmacy prescription data, the date when the drug was dispensed plus the number of days of supply are used to extrapolate the End Date for the Drug Exposure. Depending on the country-specific healthcare system, this supply information is either explicitly provided in the day_supply field or inferred from package size or similar information. -For Procedure Drugs, usually the drug is administered on a single date (i.e., the administration date). +drug_era,drug_era_end_datetime,Yes,datetime,NA,"The Drug Era End Date is the end date of the last Drug Exposure. The End Date of each Drug Exposure is either taken from the field drug_exposure_end_date or, as it is typically not available, inferred using the following rules: +For pharmacy prescription data, the date when the drug was dispensed plus the number of days of supply are used to extrapolate the End Date for the Drug Exposure. Depending on the country-specific healthcare system, this supply information is either explicitly provided in the day_supply field or inferred from package size or similar information. +For Procedure Drugs, usually the drug is administered on a single date (i.e., the administration date). A standard Persistence Window of 30 days (gap, slack) is permitted between two subsequent such extrapolated DRUG_EXPOSURE records to be considered to be merged into a single Drug Era.",No,No,NA,NA,NA,NA,NA drug_era,drug_exposure_count,No,integer,The count of grouped DRUG_EXPOSURE records that were included in the DRUG_ERA row.,NA,No,No,NA,NA,NA,NA,NA drug_era,gap_days,No,integer,NA,"The Gap Days determine how many total drug-free days are observed between all Drug Exposure events that contribute to a DRUG_ERA record. It is assumed that the drugs are ""not stockpiled"" by the patient, i.e. that if a new drug prescription or refill is observed (a new DRUG_EXPOSURE record is written), the remaining supply from the previous events is abandoned. The difference between Persistence Window and Gap Days is that the former is the maximum drug-free time allowed between two subsequent DRUG_EXPOSURE records, while the latter is the sum of actual drug-free days for the given Drug Era under the above assumption of non-stockpiling.",No,No,NA,NA,NA,NA,NA @@ -372,20 +372,20 @@ dose_era,dose_era_end_datetime,Yes,datetime,NA,The date the Person was no longer condition_era,condition_era_id,Yes,bigint,NA,NA,Yes,No,NA,NA,NA,NA,NA condition_era,person_id,Yes,bigint,NA,NA,No,No,PERSON,PERSON_ID,NA,NA,NA condition_era,condition_concept_id,Yes,integer,The Concept Id representing the Condition.,NA,No,Yes,CONCEPT,CONCEPT_ID,Condition,NA,NA -condition_era,condition_era_start_datetime,Yes,datetime,"The start date for the Condition Era -constructed from the individual -instances of Condition Occurrences. -It is the start date of the very first -chronologically recorded instance of +condition_era,condition_era_start_datetime,Yes,datetime,"The start date for the Condition Era +constructed from the individual +instances of Condition Occurrences. +It is the start date of the very first +chronologically recorded instance of the condition with at least 31 days since any prior record of the same Condition.",NA,No,No,NA,NA,NA,NA,NA -condition_era,condition_era_end_datetime,Yes,datetime,"The end date for the Condition Era -constructed from the individual -instances of Condition Occurrences. -It is the end date of the final -continuously recorded instance of the +condition_era,condition_era_end_datetime,Yes,datetime,"The end date for the Condition Era +constructed from the individual +instances of Condition Occurrences. +It is the end date of the final +continuously recorded instance of the Condition.",NA,No,No,NA,NA,NA,NA,NA -condition_era,condition_occurrence_count,No,integer,"The number of individual Condition -Occurrences used to construct the +condition_era,condition_occurrence_count,No,integer,"The number of individual Condition +Occurrences used to construct the condition era.",NA,No,No,NA,NA,NA,NA,NA metadata,metadata_concept_id,Yes,integer,NA,NA,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA metadata,metadata_type_concept_id,Yes,integer,NA,NA,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA @@ -407,57 +407,57 @@ cdm_source,vocabulary_version,No,varchar(20),NA,NA,No,No,NA,NA,NA,NA,NA concept,concept_id,Yes,integer,A unique identifier for each Concept across all domains.,NA,Yes,No,NA,NA,NA,NA,NA concept,concept_name,Yes,varchar(255),"An unambiguous, meaningful and descriptive name for the Concept.",NA,No,No,NA,NA,NA,NA,NA concept,domain_id,Yes,varchar(20),A foreign key to the [DOMAIN](https://ohdsi.github.io/CommonDataModel/cdm531.html#domain) table the Concept belongs to.,NA,No,Yes,DOMAIN,DOMAIN_ID,NA,NA,NA -concept,vocabulary_id,Yes,varchar(20),"A foreign key to the [VOCABULARY](https://ohdsi.github.io/CommonDataModel/cdm531.html#vocabulary) -table indicating from which source the +concept,vocabulary_id,Yes,varchar(20),"A foreign key to the [VOCABULARY](https://ohdsi.github.io/CommonDataModel/cdm531.html#vocabulary) +table indicating from which source the Concept has been adapted.",NA,No,Yes,VOCABULARY,VOCABULARY_ID,NA,NA,NA -concept,concept_class_id,Yes,varchar(20),"The attribute or concept class of the -Concept. Examples are 'Clinical Drug', +concept,concept_class_id,Yes,varchar(20),"The attribute or concept class of the +Concept. Examples are 'Clinical Drug', 'Ingredient', 'Clinical Finding' etc.",NA,No,Yes,CONCEPT_CLASS,CONCEPT_CLASS_ID,NA,NA,NA -concept,standard_concept,No,varchar(1),"This flag determines where a Concept is -a Standard Concept, i.e. is used in the -data, a Classification Concept, or a -non-standard Source Concept. The -allowable values are 'S' (Standard -Concept) and 'C' (Classification +concept,standard_concept,No,varchar(1),"This flag determines where a Concept is +a Standard Concept, i.e. is used in the +data, a Classification Concept, or a +non-standard Source Concept. The +allowable values are 'S' (Standard +Concept) and 'C' (Classification Concept), otherwise the content is NULL.",NA,No,No,NA,NA,NA,NA,NA -concept,concept_code,Yes,varchar(50),"The concept code represents the identifier -of the Concept in the source vocabulary, -such as SNOMED-CT concept IDs, -RxNorm RXCUIs etc. Note that concept +concept,concept_code,Yes,varchar(50),"The concept code represents the identifier +of the Concept in the source vocabulary, +such as SNOMED-CT concept IDs, +RxNorm RXCUIs etc. Note that concept codes are not unique across vocabularies.",NA,No,No,NA,NA,NA,NA,NA -concept,valid_start_date,Yes,date,"The date when the Concept was first -recorded. The default value is -1-Jan-1970, meaning, the Concept has no +concept,valid_start_date,Yes,date,"The date when the Concept was first +recorded. The default value is +1-Jan-1970, meaning, the Concept has no (known) date of inception.",NA,No,No,NA,NA,NA,NA,NA -concept,valid_end_date,Yes,date,"The date when the Concept became -invalid because it was deleted or -superseded (updated) by a new concept. -The default value is 31-Dec-2099, -meaning, the Concept is valid until it +concept,valid_end_date,Yes,date,"The date when the Concept became +invalid because it was deleted or +superseded (updated) by a new concept. +The default value is 31-Dec-2099, +meaning, the Concept is valid until it becomes deprecated.",NA,No,No,NA,NA,NA,NA,NA -concept,invalid_reason,No,varchar(1),"Reason the Concept was invalidated. -Possible values are D (deleted), U -(replaced with an update) or NULL when +concept,invalid_reason,No,varchar(1),"Reason the Concept was invalidated. +Possible values are D (deleted), U +(replaced with an update) or NULL when valid_end_date has the default value.",NA,No,No,NA,NA,NA,NA,NA -vocabulary,vocabulary_id,Yes,varchar(20),"A unique identifier for each Vocabulary, such +vocabulary,vocabulary_id,Yes,varchar(20),"A unique identifier for each Vocabulary, such as ICD9CM, SNOMED, Visit.",NA,Yes,No,NA,NA,NA,NA,NA -vocabulary,vocabulary_name,Yes,varchar(255),"The name describing the vocabulary, for -example International Classification of -Diseases, Ninth Revision, Clinical +vocabulary,vocabulary_name,Yes,varchar(255),"The name describing the vocabulary, for +example International Classification of +Diseases, Ninth Revision, Clinical Modification, Volume 1 and 2 (NCHS) etc.",NA,No,No,NA,NA,NA,NA,NA -vocabulary,vocabulary_reference,Yes,varchar(255),"External reference to documentation or -available download of the about the +vocabulary,vocabulary_reference,Yes,varchar(255),"External reference to documentation or +available download of the about the vocabulary.",NA,No,No,NA,NA,NA,NA,NA -vocabulary,vocabulary_version,No,varchar(255),"Version of the Vocabulary as indicated in +vocabulary,vocabulary_version,No,varchar(255),"Version of the Vocabulary as indicated in the source.",NA,No,No,NA,NA,NA,NA,NA vocabulary,vocabulary_concept_id,Yes,integer,A Concept that represents the Vocabulary the VOCABULARY record belongs to.,NA,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA domain,domain_id,Yes,varchar(20),A unique key for each domain.,NA,Yes,No,NA,NA,NA,NA,NA -domain,domain_name,Yes,varchar(255),"The name describing the Domain, e.g. -Condition, Procedure, Measurement +domain,domain_name,Yes,varchar(255),"The name describing the Domain, e.g. +Condition, Procedure, Measurement etc.",NA,No,No,NA,NA,NA,NA,NA domain,domain_concept_id,Yes,integer,A Concept representing the Domain Concept the DOMAIN record belongs to.,NA,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA concept_class,concept_class_id,Yes,varchar(20),A unique key for each class.,NA,Yes,No,NA,NA,NA,NA,NA -concept_class,concept_class_name,Yes,varchar(255),"The name describing the Concept Class, e.g. +concept_class,concept_class_name,Yes,varchar(255),"The name describing the Concept Class, e.g. Clinical Finding, Ingredient, etc.",NA,No,No,NA,NA,NA,NA,NA concept_class,concept_class_concept_id,Yes,integer,A Concept that represents the Concept Class.,NA,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA concept_relationship,concept_id_1,Yes,integer,NA,NA,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA @@ -475,50 +475,50 @@ relationship,relationship_concept_id,Yes,integer,NA,NA,No,Yes,CONCEPT,CONCEPT_ID concept_synonym,concept_id,Yes,integer,NA,NA,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA concept_synonym,concept_synonym_name,Yes,varchar(1000),NA,NA,No,No,NA,NA,NA,NA,NA concept_synonym,language_concept_id,Yes,integer,NA,NA,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA -concept_ancestor,ancestor_concept_id,Yes,integer,"The Concept Id for the higher-level concept +concept_ancestor,ancestor_concept_id,Yes,integer,"The Concept Id for the higher-level concept that forms the ancestor in the relationship.",NA,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA -concept_ancestor,descendant_concept_id,Yes,integer,"The Concept Id for the lower-level concept -that forms the descendant in the +concept_ancestor,descendant_concept_id,Yes,integer,"The Concept Id for the lower-level concept +that forms the descendant in the relationship.",NA,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA -concept_ancestor,min_levels_of_separation,Yes,integer,"The minimum separation in number of -levels of hierarchy between ancestor and -descendant concepts. This is an attribute +concept_ancestor,min_levels_of_separation,Yes,integer,"The minimum separation in number of +levels of hierarchy between ancestor and +descendant concepts. This is an attribute that is used to simplify hierarchic analysis.",NA,No,No,NA,NA,NA,NA,NA -concept_ancestor,max_levels_of_separation,Yes,integer,"The maximum separation in number of -levels of hierarchy between ancestor and -descendant concepts. This is an attribute +concept_ancestor,max_levels_of_separation,Yes,integer,"The maximum separation in number of +levels of hierarchy between ancestor and +descendant concepts. This is an attribute that is used to simplify hierarchic analysis.",NA,No,No,NA,NA,NA,NA,NA -source_to_concept_map,source_code,Yes,varchar(50),"The source code being translated +source_to_concept_map,source_code,Yes,varchar(50),"The source code being translated into a Standard Concept.",NA,No,No,NA,NA,NA,NA,NA -source_to_concept_map,source_concept_id,Yes,integer,"A foreign key to the Source -Concept that is being translated +source_to_concept_map,source_concept_id,Yes,integer,"A foreign key to the Source +Concept that is being translated into a Standard Concept.","This is either 0 or should be a number above 2 billion, which are the Concepts reserved for site-specific codes and mappings.",No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA -source_to_concept_map,source_vocabulary_id,Yes,varchar(20),"A foreign key to the -VOCABULARY table defining the -vocabulary of the source code that -is being translated to a Standard +source_to_concept_map,source_vocabulary_id,Yes,varchar(20),"A foreign key to the +VOCABULARY table defining the +vocabulary of the source code that +is being translated to a Standard Concept.",NA,No,No,NA,NA,NA,NA,NA -source_to_concept_map,source_code_description,No,varchar(255),"An optional description for the -source code. This is included as a -convenience to compare the -description of the source code to +source_to_concept_map,source_code_description,No,varchar(255),"An optional description for the +source code. This is included as a +convenience to compare the +description of the source code to the name of the concept.",NA,No,No,NA,NA,NA,NA,NA -source_to_concept_map,target_concept_id,Yes,integer,"The target Concept -to which the source code is being +source_to_concept_map,target_concept_id,Yes,integer,"The target Concept +to which the source code is being mapped.",NA,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA source_to_concept_map,target_vocabulary_id,Yes,varchar(20),The Vocabulary of the target Concept.,NA,No,Yes,VOCABULARY,VOCABULARY_ID,NA,NA,NA -source_to_concept_map,valid_start_date,Yes,date,"The date when the mapping +source_to_concept_map,valid_start_date,Yes,date,"The date when the mapping instance was first recorded.",NA,No,No,NA,NA,NA,NA,NA -source_to_concept_map,valid_end_date,Yes,date,"The date when the mapping -instance became invalid because it -was deleted or superseded -(updated) by a new relationship. +source_to_concept_map,valid_end_date,Yes,date,"The date when the mapping +instance became invalid because it +was deleted or superseded +(updated) by a new relationship. Default value is 31-Dec-2099.",NA,No,No,NA,NA,NA,NA,NA -source_to_concept_map,invalid_reason,No,varchar(1),"Reason the mapping instance was -invalidated. Possible values are D -(deleted), U (replaced with an -update) or NULL when -valid_end_date has the default +source_to_concept_map,invalid_reason,No,varchar(1),"Reason the mapping instance was +invalidated. Possible values are D +(deleted), U (replaced with an +update) or NULL when +valid_end_date has the default value.",NA,No,No,NA,NA,NA,NA,NA drug_strength,drug_concept_id,Yes,integer,The Concept representing the Branded Drug or Clinical Drug Product.,NA,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA drug_strength,ingredient_concept_id,Yes,integer,The Concept representing the active ingredient contained within the drug product.,"Combination Drugs will have more than one record in this table, one for each active Ingredient.",No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA @@ -529,8 +529,8 @@ drug_strength,numerator_unit_concept_id,No,integer,The Concept representing the drug_strength,denominator_value,No,float,"The amount of total liquid (or other divisible product, such as ointment, gel, spray, etc.).",NA,No,No,NA,NA,NA,NA,NA drug_strength,denominator_unit_concept_id,No,integer,The Concept representing the denominator unit for the concentration of active ingredient.,NA,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA drug_strength,box_size,No,integer,The number of units of Clinical Branded Drug or Quantified Clinical or Branded Drug contained in a box as dispensed to the patient.,NA,No,No,NA,NA,NA,NA,NA -drug_strength,valid_start_date,Yes,date,"The date when the Concept was first -recorded. The default value is +drug_strength,valid_start_date,Yes,date,"The date when the Concept was first +recorded. The default value is 1-Jan-1970.",NA,No,No,NA,NA,NA,NA,NA drug_strength,valid_end_date,Yes,date,The date when then Concept became invalid.,NA,No,No,NA,NA,NA,NA,NA drug_strength,invalid_reason,No,varchar(1),"Reason the concept was invalidated. Possible values are D (deleted), U (replaced with an update) or NULL when valid_end_date has the default value.",NA,No,No,NA,NA,NA,NA,NA From feb0b7964d1ed28fddc3aecbdb2c68403efe8d77 Mon Sep 17 00:00:00 2001 From: Eljas Roellin <65244425+eroell@users.noreply.github.com> Date: Mon, 22 Jul 2024 16:11:18 +0200 Subject: [PATCH 15/39] Fix typos cdm54.html --- docs/cdm54.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cdm54.html b/docs/cdm54.html index e705e60..e30d89e 100644 --- a/docs/cdm54.html +++ b/docs/cdm54.html @@ -2870,7 +2870,7 @@ table addresses this issue. Family history and past diagnoses (‘history of’) are not recorded in this table. Instead, they are listed in the OBSERVATION table. Codes written in the process of establishing the diagnosis, such -as ‘question of’ of and ‘rule out’, should not represented here. +as ‘question of’ and ‘rule out’, should not be represented here. Instead, they should be recorded in the OBSERVATION table, if they are used for analyses. However, this information is not From 990531b3b2b3d644458c7c041e0fbe77e0b6ddff Mon Sep 17 00:00:00 2001 From: Eljas Roellin <65244425+eroell@users.noreply.github.com> Date: Mon, 22 Jul 2024 16:19:31 +0200 Subject: [PATCH 16/39] Fix typo in cdm53.html --- docs/cdm53.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cdm53.html b/docs/cdm53.html index 577752b..c2745d2 100644 --- a/docs/cdm53.html +++ b/docs/cdm53.html @@ -2746,7 +2746,7 @@ table addresses this issue. Family history and past diagnoses (‘history of’) are not recorded in this table. Instead, they are listed in the OBSERVATION table. Codes written in the process of establishing the diagnosis, such -as ‘question of’ of and ‘rule out’, should not represented here. +as ‘question of’ and ‘rule out’, should not be represented here. Instead, they should be recorded in the OBSERVATION table, if they are used for analyses. However, this information is not From ce456b4971bdf9ebdd8014f3876f0e134dc94cf0 Mon Sep 17 00:00:00 2001 From: Eljas Roellin <65244425+eroell@users.noreply.github.com> Date: Mon, 22 Jul 2024 16:20:21 +0200 Subject: [PATCH 17/39] Fix typo in cdm60.html --- docs/cdm60.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cdm60.html b/docs/cdm60.html index 03870a4..92af71b 100644 --- a/docs/cdm60.html +++ b/docs/cdm60.html @@ -790,7 +790,7 @@ table addresses this issue. Family history and past diagnoses (‘history of’) are not recorded in this table. Instead, they are listed in the OBSERVATION table. Codes written in the process of establishing the diagnosis, such -as ‘question of’ of and ‘rule out’, should not represented here. +as ‘question of’ and ‘rule out’, should not be represented here. Instead, they should be recorded in the OBSERVATION table, if they are used for analyses. However, this information is not From 1de5a4b0f743408a4c74d50a9e93d3f4bebbf9f4 Mon Sep 17 00:00:00 2001 From: Eljas Roellin Date: Mon, 22 Jul 2024 18:08:50 +0200 Subject: [PATCH 18/39] fix typos in .csv s --- inst/csv/OMOP_CDMv5.3_Table_Level.csv | 2 +- inst/csv/OMOP_CDMv5.4_Table_Level.csv | 2 +- inst/csv/OMOP_CDMv6.0_Table_Level.csv | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/inst/csv/OMOP_CDMv5.3_Table_Level.csv b/inst/csv/OMOP_CDMv5.3_Table_Level.csv index 2551ccf..26bbb99 100644 --- a/inst/csv/OMOP_CDMv5.3_Table_Level.csv +++ b/inst/csv/OMOP_CDMv5.3_Table_Level.csv @@ -17,7 +17,7 @@ visit_occurrence,CDM,No,VISIT_,Yes,0,NA,"This table contains Events where Person The Visit duration, or 'length of stay', is defined as VISIT_END_DATE - VISIT_START_DATE. For all Visits this is <1 day, except Inpatient Visits and Non-hospital institution Visits. The CDM also contains the VISIT_DETAIL table where additional information about the Visit is stored, for example, transfers between units during an inpatient Visit.","Visits can be derived easily if the source data contain coding systems for Place of Service or Procedures, like CPT codes for well visits. In those cases, the codes can be looked up and mapped to a Standard Visit Concept. Otherwise, Visit Concepts have to be identified in the ETL process. This table will contain concepts in the Visit domain. These concepts are arranged in a hierarchical structure to facilitate cohort definitions by rolling up to generally familiar Visits adopted in most healthcare systems worldwide. Visits can be adjacent to each other, i.e. the end date of one can be identical with the start date of the other. As a consequence, more than one-day Visits or their descendants can be recorded for the same day. Multi-day visits must not overlap, i.e. share days other than start and end days. It is often the case that some logic should be written for how to define visits and how to assign Visit_Concept_Id. For example, in US claims outpatient visits that appear to occur within the time period of an inpatient visit can be rolled into one with the same Visit_Occurrence_Id. In EHR data inpatient visits that are within one day of each other may be strung together to create one visit. It will all depend on the source data and how encounter records should be translated to visit occurrences. Providers can be associated with a Visit through the PROVIDER_ID field, or indirectly through PROCEDURE_OCCURRENCE records linked both to the VISIT and PROVIDER tables." visit_detail,CDM,No,VISIT_DETAIL_,Yes,0,NA,The VISIT_DETAIL table is an optional table used to represents details of each record in the parent VISIT_OCCURRENCE table. A good example of this would be the movement between units in a hospital during an inpatient stay or claim lines associated with a one insurance claim. For every record in the VISIT_OCCURRENCE table there may be 0 or more records in the VISIT_DETAIL table with a 1:n relationship where n may be 0. The VISIT_DETAIL table is structurally very similar to VISIT_OCCURRENCE table and belongs to the visit domain.,"The configuration defining the Visit Detail is described by Concepts in the Visit Domain, which form a hierarchical structure. The Visit Detail record will have an associated to the Visit Occurrence record in two ways:
1. The Visit Detail record will have the VISIT_OCCURRENCE_ID it is associated to 2. The VISIT_DETAIL_CONCEPT_ID will be a descendant of the VISIT_CONCEPT_ID for the Visit.","It is not mandatory that the VISIT_DETAIL table be filled in, but if you find that the logic to create VISIT_OCCURRENCE records includes the roll-up of multiple smaller records to create one picture of a Visit then it is a good idea to use VISIT_DETAIL. In EHR data, for example, a Person may be in the hospital but instead of one over-arching Visit their encounters are recorded as times they interacted with a health care provider. A Person in the hospital interacts with multiple providers multiple times a day so the encounters must be strung together using some heuristic (defined by the ETL) to identify the entire Visit. In this case the encounters would be considered Visit Details and the entire Visit would be the Visit Occurrence. In this example it is also possible to use the Vocabulary to distinguish Visit Details from a Visit Occurrence by setting the VISIT_CONCEPT_ID to [9201](https://athena.ohdsi.org/search-terms/terms/9201) and the VISIT_DETAIL_CONCEPT_IDs either to 9201 or its children to indicate where the patient was in the hospital at the time of care." -condition_occurrence,CDM,No,CONDITION_,Yes,0,NA,"This table contains records of Events of a Person suggesting the presence of a disease or medical condition stated as a diagnosis, a sign, or a symptom, which is either observed by a Provider or reported by the patient.","Conditions are defined by Concepts from the Condition domain, which form a complex hierarchy. As a result, the same Person with the same disease may have multiple Condition records, which belong to the same hierarchical family. Most Condition records are mapped from diagnostic codes, but recorded signs, symptoms and summary descriptions also contribute to this table. Rule out diagnoses should not be recorded in this table, but in reality their negating nature is not always captured in the source data, and other precautions must be taken when when identifying Persons who should suffer from the recorded Condition. Record all conditions as they exist in the source data. Any decisions about diagnosis/phenotype definitions would be done through cohort specifications. These cohorts can be housed in the [COHORT](https://ohdsi.github.io/CommonDataModel/cdm531.html#payer_plan_period) table. Conditions span a time interval from start to end, but are typically recorded as single snapshot records with no end date. The reason is twofold: (i) At the time of the recording the duration is not known and later not recorded, and (ii) the Persons typically cease interacting with the healthcare system when they feel better, which leads to incomplete capture of resolved Conditions. The [CONDITION_ERA](https://ohdsi.github.io/CommonDataModel/cdm531.html#condition_era) table addresses this issue. Family history and past diagnoses ('history of') are not recorded in this table. Instead, they are listed in the [OBSERVATION](https://ohdsi.github.io/CommonDataModel/cdm531.html#observation) table. Codes written in the process of establishing the diagnosis, such as 'question of' of and 'rule out', should not represented here. Instead, they should be recorded in the [OBSERVATION](https://ohdsi.github.io/CommonDataModel/cdm531.html#observation) table, if they are used for analyses. However, this information is not always available.",Source codes and source text fields mapped to Standard Concepts of the Condition Domain have to be recorded here. +condition_occurrence,CDM,No,CONDITION_,Yes,0,NA,"This table contains records of Events of a Person suggesting the presence of a disease or medical condition stated as a diagnosis, a sign, or a symptom, which is either observed by a Provider or reported by the patient.","Conditions are defined by Concepts from the Condition domain, which form a complex hierarchy. As a result, the same Person with the same disease may have multiple Condition records, which belong to the same hierarchical family. Most Condition records are mapped from diagnostic codes, but recorded signs, symptoms and summary descriptions also contribute to this table. Rule out diagnoses should not be recorded in this table, but in reality their negating nature is not always captured in the source data, and other precautions must be taken when when identifying Persons who should suffer from the recorded Condition. Record all conditions as they exist in the source data. Any decisions about diagnosis/phenotype definitions would be done through cohort specifications. These cohorts can be housed in the [COHORT](https://ohdsi.github.io/CommonDataModel/cdm531.html#payer_plan_period) table. Conditions span a time interval from start to end, but are typically recorded as single snapshot records with no end date. The reason is twofold: (i) At the time of the recording the duration is not known and later not recorded, and (ii) the Persons typically cease interacting with the healthcare system when they feel better, which leads to incomplete capture of resolved Conditions. The [CONDITION_ERA](https://ohdsi.github.io/CommonDataModel/cdm531.html#condition_era) table addresses this issue. Family history and past diagnoses ('history of') are not recorded in this table. Instead, they are listed in the [OBSERVATION](https://ohdsi.github.io/CommonDataModel/cdm531.html#observation) table. Codes written in the process of establishing the diagnosis, such as 'question of' and 'rule out', should not be represented here. Instead, they should be recorded in the [OBSERVATION](https://ohdsi.github.io/CommonDataModel/cdm531.html#observation) table, if they are used for analyses. However, this information is not always available.",Source codes and source text fields mapped to Standard Concepts of the Condition Domain have to be recorded here. drug_exposure,CDM,No,DRUG_,Yes,0,NA,"This table captures records about the exposure to a Drug ingested or otherwise introduced into the body. A Drug is a biochemical substance formulated in such a way that when administered to a Person it will exert a certain biochemical effect on the metabolism. Drugs include prescription and over-the-counter medicines, vaccines, and large-molecule biologic therapies. Radiological devices ingested or applied locally do not count as Drugs.","The purpose of records in this table is to indicate an exposure to a certain drug as best as possible. In this context a drug is defined as an active ingredient. Drug Exposures are defined by Concepts from the Drug domain, which form a complex hierarchy. As a result, one DRUG_SOURCE_CONCEPT_ID may map to multiple standard concept ids if it is a combination product. Records in this table represent prescriptions written, prescriptions dispensed, and drugs administered by a provider to name a few. The DRUG_TYPE_CONCEPT_ID can be used to find and filter on these types. This table includes additional information about the drug products, the quantity given, and route of administration.","Information about quantity and dose is provided in a variety of different ways and it is important for the ETL to provide as much information as possible from the data. Depending on the provenance of the data fields may be captured differently i.e. quantity for drugs administered may have a separate meaning from quantity for prescriptions dispensed. If a patient has multiple records on the same day for the same drug or procedures the ETL should not de-dupe them unless there is probable reason to believe the item is a true data duplicate. Take note on how to handle refills for prescriptions written.

For detailed conventions on how to populate this table, please refer to the [THEMIS repository](https://ohdsi.github.io/Themis/drug_exposure.html)." procedure_occurrence,CDM,No,PROCEDURE_,Yes,0,NA,"This table contains records of activities or processes ordered by, or carried out by, a healthcare provider on the patient with a diagnostic or therapeutic purpose.","Lab tests are not a procedure, if something is observed with an expected resulting amount and unit then it should be a measurement. Phlebotomy is a procedure but so trivial that it tends to be rarely captured. It can be assumed that there is a phlebotomy procedure associated with many lab tests, therefore it is unnecessary to add them as separate procedures. If the user finds the same procedure over concurrent days, it is assumed those records are part of a procedure lasting more than a day. This logic is in lieu of the procedure_end_date, which will be added in a future version of the CDM.","If a procedure lasts more than 24 hours, then it should be recorded as a separate record for each day the procedure occurred, this logic is in lieu of the PROCEDURE_END_DATE, which will be added in a future version of the CDM. When dealing with duplicate records, the ETL must determine whether to sum them up into one record or keep them separate. Things to consider are: - Same Procedure - Same PROCEDURE_DATETIME - Same Visit Occurrence or Visit Detail - Same Provider - Same Modifier for Procedures. Source codes and source text fields mapped to Standard Concepts of the Procedure Domain have to be recorded here." device_exposure,CDM,No,DEVICE_,Yes,0,NA,"The Device domain captures information about a person's exposure to a foreign physical object or instrument which is used for diagnostic or therapeutic purposes through a mechanism beyond chemical action. Devices include implantable objects (e.g. pacemakers, stents, artificial joints), medical equipment and supplies (e.g. bandages, crutches, syringes), other instruments used in medical procedures (e.g. sutures, defibrillators) and material used in clinical care (e.g. adhesives, body material, dental material, surgical material).","The distinction between Devices or supplies and Procedures are sometimes blurry, but the former are physical objects while the latter are actions, often to apply a Device or supply.",Source codes and source text fields mapped to Standard Concepts of the Device Domain have to be recorded here. diff --git a/inst/csv/OMOP_CDMv5.4_Table_Level.csv b/inst/csv/OMOP_CDMv5.4_Table_Level.csv index b1091f9..d167d18 100644 --- a/inst/csv/OMOP_CDMv5.4_Table_Level.csv +++ b/inst/csv/OMOP_CDMv5.4_Table_Level.csv @@ -17,7 +17,7 @@ visit_occurrence,CDM,No,VISIT_,Yes,0,NA,"This table contains Events where Person The Visit duration, or 'length of stay', is defined as VISIT_END_DATE - VISIT_START_DATE. For all Visits this is <1 day, except Inpatient Visits and Non-hospital institution Visits. The CDM also contains the VISIT_DETAIL table where additional information about the Visit is stored, for example, transfers between units during an inpatient Visit.","Visits can be derived easily if the source data contain coding systems for Place of Service or Procedures, like CPT codes for well visits. In those cases, the codes can be looked up and mapped to a Standard Visit Concept. Otherwise, Visit Concepts have to be identified in the ETL process. This table will contain concepts in the Visit domain. These concepts are arranged in a hierarchical structure to facilitate cohort definitions by rolling up to generally familiar Visits adopted in most healthcare systems worldwide. Visits can be adjacent to each other, i.e. the end date of one can be identical with the start date of the other. As a consequence, more than one-day Visits or their descendants can be recorded for the same day. Multi-day visits must not overlap, i.e. share days other than start and end days. It is often the case that some logic should be written for how to define visits and how to assign Visit_Concept_Id. For example, in US claims outpatient visits that appear to occur within the time period of an inpatient visit can be rolled into one with the same Visit_Occurrence_Id. In EHR data inpatient visits that are within one day of each other may be strung together to create one visit. It will all depend on the source data and how encounter records should be translated to visit occurrences. Providers can be associated with a Visit through the PROVIDER_ID field, or indirectly through PROCEDURE_OCCURRENCE records linked both to the VISIT and PROVIDER tables." visit_detail,CDM,No,VISIT_DETAIL_,Yes,0,NA,The VISIT_DETAIL table is an optional table used to represents details of each record in the parent VISIT_OCCURRENCE table. A good example of this would be the movement between units in a hospital during an inpatient stay or claim lines associated with a one insurance claim. For every record in the VISIT_OCCURRENCE table there may be 0 or more records in the VISIT_DETAIL table with a 1:n relationship where n may be 0. The VISIT_DETAIL table is structurally very similar to VISIT_OCCURRENCE table and belongs to the visit domain.,"The configuration defining the Visit Detail is described by Concepts in the Visit Domain, which form a hierarchical structure. The Visit Detail record will have an associated to the Visit Occurrence record in two ways:
1. The Visit Detail record will have the VISIT_OCCURRENCE_ID it is associated to 2. The VISIT_DETAIL_CONCEPT_ID will be a descendant of the VISIT_CONCEPT_ID for the Visit.","It is not mandatory that the VISIT_DETAIL table be filled in, but if you find that the logic to create VISIT_OCCURRENCE records includes the roll-up of multiple smaller records to create one picture of a Visit then it is a good idea to use VISIT_DETAIL. In EHR data, for example, a Person may be in the hospital but instead of one over-arching Visit their encounters are recorded as times they interacted with a health care provider. A Person in the hospital interacts with multiple providers multiple times a day so the encounters must be strung together using some heuristic (defined by the ETL) to identify the entire Visit. In this case the encounters would be considered Visit Details and the entire Visit would be the Visit Occurrence. In this example it is also possible to use the Vocabulary to distinguish Visit Details from a Visit Occurrence by setting the VISIT_CONCEPT_ID to [9201](https://athena.ohdsi.org/search-terms/terms/9201) and the VISIT_DETAIL_CONCEPT_IDs either to 9201 or its children to indicate where the patient was in the hospital at the time of care." -condition_occurrence,CDM,No,CONDITION_,Yes,0,NA,"This table contains records of Events of a Person suggesting the presence of a disease or medical condition stated as a diagnosis, a sign, or a symptom, which is either observed by a Provider or reported by the patient.","Conditions are defined by Concepts from the Condition domain, which form a complex hierarchy. As a result, the same Person with the same disease may have multiple Condition records, which belong to the same hierarchical family. Most Condition records are mapped from diagnostic codes, but recorded signs, symptoms and summary descriptions also contribute to this table. Rule out diagnoses should not be recorded in this table, but in reality their negating nature is not always captured in the source data, and other precautions must be taken when when identifying Persons who should suffer from the recorded Condition. Record all conditions as they exist in the source data. Any decisions about diagnosis/phenotype definitions would be done through cohort specifications. These cohorts can be housed in the [COHORT](https://ohdsi.github.io/CommonDataModel/cdm531.html#payer_plan_period) table. Conditions span a time interval from start to end, but are typically recorded as single snapshot records with no end date. The reason is twofold: (i) At the time of the recording the duration is not known and later not recorded, and (ii) the Persons typically cease interacting with the healthcare system when they feel better, which leads to incomplete capture of resolved Conditions. The [CONDITION_ERA](https://ohdsi.github.io/CommonDataModel/cdm531.html#condition_era) table addresses this issue. Family history and past diagnoses ('history of') are not recorded in this table. Instead, they are listed in the [OBSERVATION](https://ohdsi.github.io/CommonDataModel/cdm531.html#observation) table. Codes written in the process of establishing the diagnosis, such as 'question of' of and 'rule out', should not represented here. Instead, they should be recorded in the [OBSERVATION](https://ohdsi.github.io/CommonDataModel/cdm531.html#observation) table, if they are used for analyses. However, this information is not always available.",Source codes and source text fields mapped to Standard Concepts of the Condition Domain have to be recorded here. +condition_occurrence,CDM,No,CONDITION_,Yes,0,NA,"This table contains records of Events of a Person suggesting the presence of a disease or medical condition stated as a diagnosis, a sign, or a symptom, which is either observed by a Provider or reported by the patient.","Conditions are defined by Concepts from the Condition domain, which form a complex hierarchy. As a result, the same Person with the same disease may have multiple Condition records, which belong to the same hierarchical family. Most Condition records are mapped from diagnostic codes, but recorded signs, symptoms and summary descriptions also contribute to this table. Rule out diagnoses should not be recorded in this table, but in reality their negating nature is not always captured in the source data, and other precautions must be taken when when identifying Persons who should suffer from the recorded Condition. Record all conditions as they exist in the source data. Any decisions about diagnosis/phenotype definitions would be done through cohort specifications. These cohorts can be housed in the [COHORT](https://ohdsi.github.io/CommonDataModel/cdm531.html#payer_plan_period) table. Conditions span a time interval from start to end, but are typically recorded as single snapshot records with no end date. The reason is twofold: (i) At the time of the recording the duration is not known and later not recorded, and (ii) the Persons typically cease interacting with the healthcare system when they feel better, which leads to incomplete capture of resolved Conditions. The [CONDITION_ERA](https://ohdsi.github.io/CommonDataModel/cdm531.html#condition_era) table addresses this issue. Family history and past diagnoses ('history of') are not recorded in this table. Instead, they are listed in the [OBSERVATION](https://ohdsi.github.io/CommonDataModel/cdm531.html#observation) table. Codes written in the process of establishing the diagnosis, such as 'question of' and 'rule out', should not be represented here. Instead, they should be recorded in the [OBSERVATION](https://ohdsi.github.io/CommonDataModel/cdm531.html#observation) table, if they are used for analyses. However, this information is not always available.",Source codes and source text fields mapped to Standard Concepts of the Condition Domain have to be recorded here. drug_exposure,CDM,No,DRUG_,Yes,0,NA,"This table captures records about the exposure to a Drug ingested or otherwise introduced into the body. A Drug is a biochemical substance formulated in such a way that when administered to a Person it will exert a certain biochemical effect on the metabolism. Drugs include prescription and over-the-counter medicines, vaccines, and large-molecule biologic therapies. Radiological devices ingested or applied locally do not count as Drugs.","The purpose of records in this table is to indicate an exposure to a certain drug as best as possible. In this context a drug is defined as an active ingredient. Drug Exposures are defined by Concepts from the Drug domain, which form a complex hierarchy. As a result, one DRUG_SOURCE_CONCEPT_ID may map to multiple standard concept ids if it is a combination product. Records in this table represent prescriptions written, prescriptions dispensed, and drugs administered by a provider to name a few. The DRUG_TYPE_CONCEPT_ID can be used to find and filter on these types. This table includes additional information about the drug products, the quantity given, and route of administration.","Information about quantity and dose is provided in a variety of different ways and it is important for the ETL to provide as much information as possible from the data. Depending on the provenance of the data fields may be captured differently i.e. quantity for drugs administered may have a separate meaning from quantity for prescriptions dispensed. If a patient has multiple records on the same day for the same drug or procedures the ETL should not de-dupe them unless there is probable reason to believe the item is a true data duplicate. Take note on how to handle refills for prescriptions written.

For detailed conventions on how to populate this table, please refer to the [THEMIS repository](https://ohdsi.github.io/Themis/drug_exposure.html)." procedure_occurrence,CDM,No,PROCEDURE_,Yes,0,NA,"This table contains records of activities or processes ordered by, or carried out by, a healthcare provider on the patient with a diagnostic or therapeutic purpose.","Lab tests are not a procedure, if something is observed with an expected resulting amount and unit then it should be a measurement. Phlebotomy is a procedure but so trivial that it tends to be rarely captured. It can be assumed that there is a phlebotomy procedure associated with many lab tests, therefore it is unnecessary to add them as separate procedures. If the user finds the same procedure over concurrent days, it is assumed those records are part of a procedure lasting more than a day. This logic is in lieu of the procedure_end_date, which will be added in a future version of the CDM.","When dealing with duplicate records, the ETL must determine whether to sum them up into one record or keep them separate. Things to consider are: - Same Procedure - Same PROCEDURE_DATETIME - Same Visit Occurrence or Visit Detail - Same Provider - Same Modifier for Procedures. Source codes and source text fields mapped to Standard Concepts of the Procedure Domain have to be recorded here." device_exposure,CDM,No,DEVICE_,Yes,0,NA,"The Device domain captures information about a person's exposure to a foreign physical object or instrument which is used for diagnostic or therapeutic purposes through a mechanism beyond chemical action. Devices include implantable objects (e.g. pacemakers, stents, artificial joints), medical equipment and supplies (e.g. bandages, crutches, syringes), other instruments used in medical procedures (e.g. sutures, defibrillators) and material used in clinical care (e.g. adhesives, body material, dental material, surgical material).","The distinction between Devices or supplies and Procedures are sometimes blurry, but the former are physical objects while the latter are actions, often to apply a Device or supply.",Source codes and source text fields mapped to Standard Concepts of the Device Domain have to be recorded here. diff --git a/inst/csv/OMOP_CDMv6.0_Table_Level.csv b/inst/csv/OMOP_CDMv6.0_Table_Level.csv index 908c15d..288ca9e 100644 --- a/inst/csv/OMOP_CDMv6.0_Table_Level.csv +++ b/inst/csv/OMOP_CDMv6.0_Table_Level.csv @@ -17,7 +17,7 @@ visit_occurrence,CDM,No,VISIT_,Yes,0,NA,"This table contains Events where Person The Visit duration, or 'length of stay', is defined as VISIT_END_DATE - VISIT_START_DATE. For all Visits this is <1 day, except Inpatient Visits and Non-hospital institution Visits. The CDM also contains the VISIT_DETAIL table where additional information about the Visit is stored, for example, transfers between units during an inpatient Visit.","Visits can be derived easily if the source data contain coding systems for Place of Service or Procedures, like CPT codes for well visits. In those cases, the codes can be looked up and mapped to a Standard Visit Concept. Otherwise, Visit Concepts have to be identified in the ETL process. This table will contain concepts in the Visit domain. These concepts are arranged in a hierarchical structure to facilitate cohort definitions by rolling up to generally familiar Visits adopted in most healthcare systems worldwide. Visits can be adjacent to each other, i.e. the end date of one can be identical with the start date of the other. As a consequence, more than one-day Visits or their descendants can be recorded for the same day. Multi-day visits must not overlap, i.e. share days other than start and end days. It is often the case that some logic should be written for how to define visits and how to assign Visit_Concept_Id. For example, in US claims outpatient visits that appear to occur within the time period of an inpatient visit can be rolled into one with the same Visit_Occurrence_Id. In EHR data inpatient visits that are within one day of each other may be strung together to create one visit. It will all depend on the source data and how encounter records should be translated to visit occurrences. Providers can be associated with a Visit through the PROVIDER_ID field, or indirectly through PROCEDURE_OCCURRENCE records linked both to the VISIT and PROVIDER tables." visit_detail,CDM,No,VISIT_DETAIL_,Yes,0,NA,The VISIT_DETAIL table is an optional table used to represents details of each record in the parent VISIT_OCCURRENCE table. A good example of this would be the movement between units in a hospital during an inpatient stay or claim lines associated with a one insurance claim. For every record in the VISIT_OCCURRENCE table there may be 0 or more records in the VISIT_DETAIL table with a 1:n relationship where n may be 0. The VISIT_DETAIL table is structurally very similar to VISIT_OCCURRENCE table and belongs to the visit domain.,"The configuration defining the Visit Detail is described by Concepts in the Visit Domain, which form a hierarchical structure. The Visit Detail record will have an associated to the Visit Occurrence record in two ways:
1. The Visit Detail record will have the VISIT_OCCURRENCE_ID it is associated to 2. The VISIT_DETAIL_CONCEPT_ID will be a descendant of the VISIT_CONCEPT_ID for the Visit.","It is not mandatory that the VISIT_DETAIL table be filled in, but if you find that the logic to create VISIT_OCCURRENCE records includes the roll-up of multiple smaller records to create one picture of a Visit then it is a good idea to use VISIT_DETAIL. In EHR data, for example, a Person may be in the hospital but instead of one over-arching Visit their encounters are recorded as times they interacted with a health care provider. A Person in the hospital interacts with multiple providers multiple times a day so the encounters must be strung together using some heuristic (defined by the ETL) to identify the entire Visit. In this case the encounters would be considered Visit Details and the entire Visit would be the Visit Occurrence. In this example it is also possible to use the Vocabulary to distinguish Visit Details from a Visit Occurrence by setting the VISIT_CONCEPT_ID to [9201](https://athena.ohdsi.org/search-terms/terms/9201) and the VISIT_DETAIL_CONCEPT_IDs either to 9201 or its children to indicate where the patient was in the hospital at the time of care." -condition_occurrence,CDM,No,CONDITION_,Yes,0,NA,"This table contains records of Events of a Person suggesting the presence of a disease or medical condition stated as a diagnosis, a sign, or a symptom, which is either observed by a Provider or reported by the patient.","Conditions are defined by Concepts from the Condition domain, which form a complex hierarchy. As a result, the same Person with the same disease may have multiple Condition records, which belong to the same hierarchical family. Most Condition records are mapped from diagnostic codes, but recorded signs, symptoms and summary descriptions also contribute to this table. Rule out diagnoses should not be recorded in this table, but in reality their negating nature is not always captured in the source data, and other precautions must be taken when when identifying Persons who should suffer from the recorded Condition. Record all conditions as they exist in the source data. Any decisions about diagnosis/phenotype definitions would be done through cohort specifications. These cohorts can be housed in the [COHORT](https://ohdsi.github.io/CommonDataModel/cdm531.html#payer_plan_period) table. Conditions span a time interval from start to end, but are typically recorded as single snapshot records with no end date. The reason is twofold: (i) At the time of the recording the duration is not known and later not recorded, and (ii) the Persons typically cease interacting with the healthcare system when they feel better, which leads to incomplete capture of resolved Conditions. The [CONDITION_ERA](https://ohdsi.github.io/CommonDataModel/cdm531.html#condition_era) table addresses this issue. Family history and past diagnoses ('history of') are not recorded in this table. Instead, they are listed in the [OBSERVATION](https://ohdsi.github.io/CommonDataModel/cdm531.html#observation) table. Codes written in the process of establishing the diagnosis, such as 'question of' of and 'rule out', should not represented here. Instead, they should be recorded in the [OBSERVATION](https://ohdsi.github.io/CommonDataModel/cdm531.html#observation) table, if they are used for analyses. However, this information is not always available.",Source codes and source text fields mapped to Standard Concepts of the Condition Domain have to be recorded here. +condition_occurrence,CDM,No,CONDITION_,Yes,0,NA,"This table contains records of Events of a Person suggesting the presence of a disease or medical condition stated as a diagnosis, a sign, or a symptom, which is either observed by a Provider or reported by the patient.","Conditions are defined by Concepts from the Condition domain, which form a complex hierarchy. As a result, the same Person with the same disease may have multiple Condition records, which belong to the same hierarchical family. Most Condition records are mapped from diagnostic codes, but recorded signs, symptoms and summary descriptions also contribute to this table. Rule out diagnoses should not be recorded in this table, but in reality their negating nature is not always captured in the source data, and other precautions must be taken when when identifying Persons who should suffer from the recorded Condition. Record all conditions as they exist in the source data. Any decisions about diagnosis/phenotype definitions would be done through cohort specifications. These cohorts can be housed in the [COHORT](https://ohdsi.github.io/CommonDataModel/cdm531.html#payer_plan_period) table. Conditions span a time interval from start to end, but are typically recorded as single snapshot records with no end date. The reason is twofold: (i) At the time of the recording the duration is not known and later not recorded, and (ii) the Persons typically cease interacting with the healthcare system when they feel better, which leads to incomplete capture of resolved Conditions. The [CONDITION_ERA](https://ohdsi.github.io/CommonDataModel/cdm531.html#condition_era) table addresses this issue. Family history and past diagnoses ('history of') are not recorded in this table. Instead, they are listed in the [OBSERVATION](https://ohdsi.github.io/CommonDataModel/cdm531.html#observation) table. Codes written in the process of establishing the diagnosis, such as 'question of' and 'rule out', should not be represented here. Instead, they should be recorded in the [OBSERVATION](https://ohdsi.github.io/CommonDataModel/cdm531.html#observation) table, if they are used for analyses. However, this information is not always available.",Source codes and source text fields mapped to Standard Concepts of the Condition Domain have to be recorded here. drug_exposure,CDM,No,DRUG_,Yes,0,NA,"This table captures records about the exposure to a Drug ingested or otherwise introduced into the body. A Drug is a biochemical substance formulated in such a way that when administered to a Person it will exert a certain biochemical effect on the metabolism. Drugs include prescription and over-the-counter medicines, vaccines, and large-molecule biologic therapies. Radiological devices ingested or applied locally do not count as Drugs.","The purpose of records in this table is to indicate an exposure to a certain drug as best as possible. In this context a drug is defined as an active ingredient. Drug Exposures are defined by Concepts from the Drug domain, which form a complex hierarchy. As a result, one DRUG_SOURCE_CONCEPT_ID may map to multiple standard concept ids if it is a combination product. Records in this table represent prescriptions written, prescriptions dispensed, and drugs administered by a provider to name a few. The DRUG_TYPE_CONCEPT_ID can be used to find and filter on these types. This table includes additional information about the drug products, the quantity given, and route of administration.",Information about quantity and dose is provided in a variety of different ways and it is important for the ETL to provide as much information as possible from the data. Depending on the provenance of the data fields may be captured differently i.e. quantity for drugs administered may have a separate meaning from quantity for prescriptions dispensed. If a patient has multiple records on the same day for the same drug or procedures the ETL should not de-dupe them unless there is probable reason to believe the item is a true data duplicate. Take note on how to handle refills for prescriptions written. procedure_occurrence,CDM,No,PROCEDURE_,Yes,0,NA,"This table contains records of activities or processes ordered by, or carried out by, a healthcare provider on the patient with a diagnostic or therapeutic purpose.","Lab tests are not a procedure, if something is observed with an expected resulting amount and unit then it should be a measurement. Phlebotomy is a procedure but so trivial that it tends to be rarely captured. It can be assumed that there is a phlebotomy procedure associated with many lab tests, therefore it is unnecessary to add them as separate procedures. If the user finds the same procedure over concurrent days, it is assumed those records are part of a procedure lasting more than a day. This logic is in lieu of the procedure_end_date, which will be added in a future version of the CDM.","If a procedure lasts more than a day, then it should be recorded as a separate record for each day the procedure occurred, this logic is in lieu of the PROCEDURE_END_DATE, which will be added in a future version of the CDM. When dealing with duplicate records, the ETL must determine whether to sum them up into one record or keep them separate. Things to consider are: - Same Procedure - Same PROCEDURE_DATETIME - Same Visit Occurrence or Visit Detail - Same Provider - Same Modifier for Procedures. Source codes and source text fields mapped to Standard Concepts of the Procedure Domain have to be recorded here." device_exposure,CDM,No,DEVICE_,Yes,0,NA,"The Device domain captures information about a person's exposure to a foreign physical object or instrument which is used for diagnostic or therapeutic purposes through a mechanism beyond chemical action. Devices include implantable objects (e.g. pacemakers, stents, artificial joints), medical equipment and supplies (e.g. bandages, crutches, syringes), other instruments used in medical procedures (e.g. sutures, defibrillators) and material used in clinical care (e.g. adhesives, body material, dental material, surgical material).","The distinction between Devices or supplies and Procedures are sometimes blurry, but the former are physical objects while the latter are actions, often to apply a Device or supply.",Source codes and source text fields mapped to Standard Concepts of the Device Domain have to be recorded here. From b437f60f1b739d04231cd220ca63f72e73dc83a2 Mon Sep 17 00:00:00 2001 From: Eljas Roellin Date: Mon, 22 Jul 2024 18:11:27 +0200 Subject: [PATCH 19/39] undo changes to htmls --- docs/cdm53.html | 2 +- docs/cdm54.html | 2 +- docs/cdm60.html | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/cdm53.html b/docs/cdm53.html index c2745d2..577752b 100644 --- a/docs/cdm53.html +++ b/docs/cdm53.html @@ -2746,7 +2746,7 @@ table addresses this issue. Family history and past diagnoses (‘history of’) are not recorded in this table. Instead, they are listed in the OBSERVATION table. Codes written in the process of establishing the diagnosis, such -as ‘question of’ and ‘rule out’, should not be represented here. +as ‘question of’ of and ‘rule out’, should not represented here. Instead, they should be recorded in the OBSERVATION table, if they are used for analyses. However, this information is not diff --git a/docs/cdm54.html b/docs/cdm54.html index e30d89e..e705e60 100644 --- a/docs/cdm54.html +++ b/docs/cdm54.html @@ -2870,7 +2870,7 @@ table addresses this issue. Family history and past diagnoses (‘history of’) are not recorded in this table. Instead, they are listed in the OBSERVATION table. Codes written in the process of establishing the diagnosis, such -as ‘question of’ and ‘rule out’, should not be represented here. +as ‘question of’ of and ‘rule out’, should not represented here. Instead, they should be recorded in the OBSERVATION table, if they are used for analyses. However, this information is not diff --git a/docs/cdm60.html b/docs/cdm60.html index 92af71b..03870a4 100644 --- a/docs/cdm60.html +++ b/docs/cdm60.html @@ -790,7 +790,7 @@ table addresses this issue. Family history and past diagnoses (‘history of’) are not recorded in this table. Instead, they are listed in the OBSERVATION table. Codes written in the process of establishing the diagnosis, such -as ‘question of’ and ‘rule out’, should not be represented here. +as ‘question of’ of and ‘rule out’, should not represented here. Instead, they should be recorded in the OBSERVATION table, if they are used for analyses. However, this information is not From c84042399c2f4fd528951aeec810ee163f00ebc6 Mon Sep 17 00:00:00 2001 From: Lawrence Adams Date: Wed, 2 Oct 2024 08:13:13 +0100 Subject: [PATCH 20/39] fix: dead links for 5.4 docs source csvs --- inst/csv/OMOP_CDMv5.4_Field_Level.csv | 20 +++---- inst/csv/OMOP_CDMv5.4_Table_Level.csv | 78 +++++++++++++-------------- 2 files changed, 49 insertions(+), 49 deletions(-) diff --git a/inst/csv/OMOP_CDMv5.4_Field_Level.csv b/inst/csv/OMOP_CDMv5.4_Field_Level.csv index 9c061b8..0db3070 100644 --- a/inst/csv/OMOP_CDMv5.4_Field_Level.csv +++ b/inst/csv/OMOP_CDMv5.4_Field_Level.csv @@ -1,14 +1,14 @@ cdmTableName,cdmFieldName,isRequired,cdmDatatype,userGuidance,etlConventions,isPrimaryKey,isForeignKey,fkTableName,fkFieldName,fkDomain,fkClass,unique DQ identifiers person,person_id,Yes,integer,It is assumed that every person with a different unique identifier is in fact a different person and should be treated independently.,"Any person linkage that needs to occur to uniquely identify Persons ought to be done prior to writing this table. This identifier can be the original id from the source data provided if it is an integer, otherwise it can be an autogenerated number.",Yes,No,NA,NA,NA,NA,NA -person,gender_concept_id,Yes,integer,This field is meant to capture the biological sex at birth of the Person. This field should not be used to study gender identity issues.,Use the gender or sex value present in the data under the assumption that it is the biological sex at birth. If the source data captures gender identity it should be stored in the [OBSERVATION](https://ohdsi.github.io/CommonDataModel/cdm531.html#observation) table. [Accepted gender concepts](http://athena.ohdsi.org/search-terms/terms?domain=Gender&standardConcept=Standard&page=1&pageSize=15&query=). Please refer to the [THEMIS repository](https://ohdsi.github.io/Themis/tag_gender_concept_id.html) for detailed conventions on how to populate this field.,No,Yes,CONCEPT,CONCEPT_ID,Gender,NA,NA +person,gender_concept_id,Yes,integer,This field is meant to capture the biological sex at birth of the Person. This field should not be used to study gender identity issues.,Use the gender or sex value present in the data under the assumption that it is the biological sex at birth. If the source data captures gender identity it should be stored in the [OBSERVATION](https://ohdsi.github.io/CommonDataModel/cdm54.html#observation) table. [Accepted gender concepts](http://athena.ohdsi.org/search-terms/terms?domain=Gender&standardConcept=Standard&page=1&pageSize=15&query=). Please refer to the [THEMIS repository](https://ohdsi.github.io/Themis/tag_gender_concept_id.html) for detailed conventions on how to populate this field.,No,Yes,CONCEPT,CONCEPT_ID,Gender,NA,NA person,year_of_birth,Yes,integer,Compute age using year_of_birth.,"For data sources with date of birth, the year should be extracted. If no year of birth is available all the person's data should be dropped from the CDM instance. For additional information on how to populate this field, please refer to the [THEMIS repository](https://ohdsi.github.io/Themis/tag_year_of_birth.html).",No,No,NA,NA,NA,NA,NA person,month_of_birth,No,integer,NA,"For data sources that provide the precise date of birth, the month should be extracted and stored in this field.",No,No,NA,NA,NA,NA,NA person,day_of_birth,No,integer,NA,"For data sources that provide the precise date of birth, the day should be extracted and stored in this field.",No,No,NA,NA,NA,NA,NA person,birth_datetime,No,datetime,NA,"This field is not required but highly encouraged. For data sources that provide the precise datetime of birth, that value should be stored in this field. For more information on how to populate this field, please refer to the [THEMIS repository](https://ohdsi.github.io/Themis/person.html).",No,No,NA,NA,NA,NA,NA person,race_concept_id,Yes,integer,This field captures race or ethnic background of the person.,"Only use this field if you have information about race or ethnic background. The Vocabulary contains Concepts about the main races and ethnic backgrounds in a hierarchical system. Due to the imprecise nature of human races and ethnic backgrounds, this is not a perfect system. Mixed races are not supported. If a clear race or ethnic background cannot be established, use Concept_Id 0. [Accepted Race Concepts](http://athena.ohdsi.org/search-terms/terms?domain=Race&standardConcept=Standard&page=1&pageSize=15&query=).",No,Yes,CONCEPT,CONCEPT_ID,Race,NA,NA person,ethnicity_concept_id,Yes,integer,"This field captures Ethnicity as defined by the Office of Management and Budget (OMB) of the US Government: it distinguishes only between ""Hispanic"" and ""Not Hispanic"". Races and ethnic backgrounds are not stored here.",Only use this field if you have US-based data and a source of this information. Do not attempt to infer Ethnicity from the race or ethnic background of the Person. [Accepted ethnicity concepts](http://athena.ohdsi.org/search-terms/terms?domain=Ethnicity&standardConcept=Standard&page=1&pageSize=15&query=),No,Yes,CONCEPT,CONCEPT_ID,Ethnicity,NA,NA -person,location_id,No,integer,The location refers to the physical address of the person. This field should capture the last known location of the person.,"Put the location_id from the [LOCATION](https://ohdsi.github.io/CommonDataModel/cdm531.html#location) table here that represents the most granular location information for the person. For additional information on how to populate this field, please refer to the [THEMIS repository](https://ohdsi.github.io/Themis/populate_person_location_id.html).",No,Yes,LOCATION,LOCATION_ID,NA,NA,NA -person,provider_id,No,integer,The Provider refers to the last known primary care provider (General Practitioner).,"Put the provider_id from the [PROVIDER](https://ohdsi.github.io/CommonDataModel/cdm531.html#provider) table of the last known general practitioner of the person. If there are multiple providers, it is up to the ETL to decide which to put here.",No,Yes,PROVIDER,PROVIDER_ID,NA,NA,NA +person,location_id,No,integer,The location refers to the physical address of the person. This field should capture the last known location of the person.,"Put the location_id from the [LOCATION](https://ohdsi.github.io/CommonDataModel/cdm54.html#location) table here that represents the most granular location information for the person. For additional information on how to populate this field, please refer to the [THEMIS repository](https://ohdsi.github.io/Themis/populate_person_location_id.html).",No,Yes,LOCATION,LOCATION_ID,NA,NA,NA +person,provider_id,No,integer,The Provider refers to the last known primary care provider (General Practitioner).,"Put the provider_id from the [PROVIDER](https://ohdsi.github.io/CommonDataModel/cdm54.html#provider) table of the last known general practitioner of the person. If there are multiple providers, it is up to the ETL to decide which to put here.",No,Yes,PROVIDER,PROVIDER_ID,NA,NA,NA person,care_site_id,No,integer,The Care Site refers to where the Provider typically provides the primary care.,NA,No,Yes,CARE_SITE,CARE_SITE_ID,NA,NA,NA person,person_source_value,No,varchar(50),Use this field to link back to persons in the source data. This is typically used for error checking of ETL logic.,Some use cases require the ability to link back to persons in the source data. This field allows for the storing of the person value as it appears in the source. This field is not required but strongly recommended.,No,No,NA,NA,NA,NA,NA person,gender_source_value,No,varchar(50),This field is used to store the biological sex of the person from the source data. It is not intended for use in standard analytics but for reference only.,Put the assigned sex at birth of the person as it appears in the source data.,No,No,NA,NA,NA,NA,NA @@ -19,7 +19,7 @@ person,ethnicity_source_value,No,varchar(50),This field is used to store the eth person,ethnicity_source_concept_id,No,integer,"Due to the small number of options, this tends to be zero.","If the source data codes ethnicity in an OMOP supported vocabulary, store the concept_id here.",No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA observation_period,observation_period_id,Yes,integer,A Person can have multiple discrete Observation Periods which are identified by the Observation_Period_Id.,Assign a unique observation_period_id to each discrete Observation Period for a Person.,Yes,No,NA,NA,NA,NA,NA observation_period,person_id,Yes,integer,The Person ID of the PERSON record for which the Observation Period is recorded.,NA,No,Yes,PERSON,PERSON_ID,NA,NA,NA -observation_period,observation_period_start_date,Yes,date,Use this date to determine the start date of the Observation Period.,"It is often the case that the idea of Observation Periods does not exist in source data. In those cases, the observation_period_start_date can be inferred as the earliest Event date available for the Person. In insurance claim data, the Observation Period can be considered as the time period the Person is enrolled with a payer. If a Person switches plans but stays with the same payer, and therefore capturing of data continues, that change would be captured in [PAYER_PLAN_PERIOD](https://ohdsi.github.io/CommonDataModel/cdm531.html#payer_plan_period).",No,No,NA,NA,NA,NA,NA +observation_period,observation_period_start_date,Yes,date,Use this date to determine the start date of the Observation Period.,"It is often the case that the idea of Observation Periods does not exist in source data. In those cases, the observation_period_start_date can be inferred as the earliest Event date available for the Person. In insurance claim data, the Observation Period can be considered as the time period the Person is enrolled with a payer. If a Person switches plans but stays with the same payer, and therefore capturing of data continues, that change would be captured in [PAYER_PLAN_PERIOD](https://ohdsi.github.io/CommonDataModel/cdm54.html#payer_plan_period).",No,No,NA,NA,NA,NA,NA observation_period,observation_period_end_date,Yes,date,Use this date to determine the end date of the period for which we can assume that all events for a Person are recorded.,"It is often the case that the idea of Observation Periods does not exist in source data. In those cases, the observation_period_end_date can be inferred as the last Event date available for the Person. In insurance claim data, the Observation Period can be considered as the time period the Person is enrolled with a payer.",No,No,NA,NA,NA,NA,NA observation_period,period_type_concept_id,Yes,integer,"This field can be used to determine the provenance of the Observation Period as in whether the period was determined from an insurance enrollment file, EHR healthcare encounters, or other sources.",Choose the observation_period_type_concept_id that best represents how the period was determined. [Accepted Concepts](https://athena.ohdsi.org/search-terms/terms?domain=Type+Concept&standardConcept=Standard&page=1&pageSize=15&query=). A more detailed explanation of each Type Concept can be found on the [vocabulary wiki](https://github.com/OHDSI/Vocabulary-v5.0/wiki/Vocab.-TYPE_CONCEPT).,No,Yes,CONCEPT,CONCEPT_ID,Type Concept,NA,NA visit_occurrence,visit_occurrence_id,Yes,integer,Use this to identify unique interactions between a person and the health care system. This identifier links across the other CDM event tables to associate events with a visit.,This should be populated by creating a unique identifier for each unique interaction between a person and the healthcare system where the person receives a medical good or service over a span of time.,Yes,No,NA,NA,NA,NA,NA @@ -36,7 +36,7 @@ For Inpatient Visits ongoing at the date of ETL, put date of processing the data - All other Visits: visit_end_datetime = visit_start_datetime. If this is a one-day visit the end date should match the start date.",No,No,NA,NA,NA,NA,NA visit_occurrence,visit_end_datetime,No,datetime,"If a Person is still an inpatient in the hospital at the time of the data extract and does not have a visit_end_datetime, then set the visit_end_datetime to the datetime of the data pull.","If no time is given for the end date of a visit, set it to midnight (00:00:0000).",No,No,NA,NA,NA,NA,NA visit_occurrence,visit_type_concept_id,Yes,Integer,"Use this field to understand the provenance of the visit record, or where the record comes from.","Populate this field based on the provenance of the visit record, as in whether it came from an EHR record or billing claim. [Accepted Concepts](https://athena.ohdsi.org/search-terms/terms?domain=Type+Concept&standardConcept=Standard&page=1&pageSize=15&query=). A more detailed explanation of each Type Concept can be found on the [vocabulary wiki](https://github.com/OHDSI/Vocabulary-v5.0/wiki/Vocab.-TYPE_CONCEPT).",No,Yes,CONCEPT,CONCEPT_ID,Type Concept,NA,NA -visit_occurrence,provider_id,No,integer,"There will only be one provider per visit record and the ETL document should clearly state how they were chosen (attending, admitting, etc.). If there are multiple providers associated with a visit in the source, this can be reflected in the event tables (CONDITION_OCCURRENCE, PROCEDURE_OCCURRENCE, etc.) or in the VISIT_DETAIL table.","If there are multiple providers associated with a visit, you will need to choose which one to put here. The additional providers can be stored in the [VISIT_DETAIL](https://ohdsi.github.io/CommonDataModel/cdm531.html#visit_detail) table.",No,Yes,PROVIDER,PROVIDER_ID,NA,NA,NA +visit_occurrence,provider_id,No,integer,"There will only be one provider per visit record and the ETL document should clearly state how they were chosen (attending, admitting, etc.). If there are multiple providers associated with a visit in the source, this can be reflected in the event tables (CONDITION_OCCURRENCE, PROCEDURE_OCCURRENCE, etc.) or in the VISIT_DETAIL table.","If there are multiple providers associated with a visit, you will need to choose which one to put here. The additional providers can be stored in the [VISIT_DETAIL](https://ohdsi.github.io/CommonDataModel/cdm54.html#visit_detail) table.",No,Yes,PROVIDER,PROVIDER_ID,NA,NA,NA visit_occurrence,care_site_id,No,integer,This field provides information about the Care Site where the Visit took place.,There should only be one Care Site associated with a Visit.,No,Yes,CARE_SITE,CARE_SITE_ID,NA,NA,NA visit_occurrence,visit_source_value,No,varchar(50),"This field houses the verbatim value from the source data representing the kind of visit that took place (inpatient, outpatient, emergency, etc.)","If there is information about the kind of visit in the source data that value should be stored here. If a visit is an amalgamation of visits from the source then use a hierarchy to choose the visit source value, such as IP -> ER-> OP. This should line up with the logic chosen to determine how visits are created.",No,No,NA,NA,NA,NA,NA visit_occurrence,visit_source_concept_id,No,integer,NA,If the visit source value is coded in the source data using an OMOP supported vocabulary put the concept id representing the source value here.,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA @@ -88,7 +88,7 @@ condition_occurrence,condition_source_concept_id,No,integer,"This is the concept condition_occurrence,condition_status_source_value,No,varchar(50),This field houses the verbatim value from the source data representing the condition status.,This information may be called something different in the source data but the field is meant to contain a value indicating when and how a diagnosis was given to a patient. This source value is mapped to a standard concept which is stored in the CONDITION_STATUS_CONCEPT_ID field.,No,No,NA,NA,NA,NA,NA drug_exposure,drug_exposure_id,Yes,integer,The unique key given to records of drug dispensings or administrations for a person. Refer to the ETL for how duplicate drugs during the same visit were handled.,"Each instance of a drug dispensing or administration present in the source data should be assigned this unique key. In some cases, a person can have multiple records of the same drug within the same visit. It is valid to keep these duplicates and assign them individual, unique, DRUG_EXPOSURE_IDs, though it is up to the ETL how they should be handled.",Yes,No,NA,NA,NA,NA,NA drug_exposure,person_id,Yes,integer,The PERSON_ID of the PERSON for whom the drug dispensing or administration is recorded. This may be a system generated code.,NA,No,Yes,PERSON,PERSON_ID,NA,NA,NA -drug_exposure,drug_concept_id,Yes,integer,"The DRUG_CONCEPT_ID field is recommended for primary use in analyses, and must be used for network studies. This is the standard concept mapped from the source concept id which represents a drug product or molecule otherwise introduced to the body. The drug concepts can have a varying degree of information about drug strength and dose. This information is relevant in the context of quantity and administration information in the subsequent fields plus strength information from the DRUG_STRENGTH table, provided as part of the standard vocabulary download.","The CONCEPT_ID that the DRUG_SOURCE_VALUE maps to. The concept id should be derived either from mapping from the source concept id or by picking the drug concept representing the most amount of detail you have. Records whose source values map to standard concepts with a domain of Drug should go in this table. When the Drug Source Value of the code cannot be translated into Standard Drug Concept IDs, a Drug exposure entry is stored with only the corresponding SOURCE_CONCEPT_ID and DRUG_SOURCE_VALUE and a DRUG_CONCEPT_ID of 0. The Drug Concept with the most detailed content of information is preferred during the mapping process. These are indicated in the CONCEPT_CLASS_ID field of the Concept and are recorded in the following order of precedence: Marketed Product, Branded Pack, Clinical Pack, Branded Drug, Clinical Drug, Branded Drug Component, Clinical Drug Component, Branded Drug Form, Clinical Drug Form, and only if no other information is available Ingredient. Note: If only the drug class is known, the DRUG_CONCEPT_ID field should contain 0. [Accepted Concepts](https://athena.ohdsi.org/search-terms/terms?domain=Drug&standardConcept=Standard&page=1&pageSize=15&query=).",No,Yes,CONCEPT,CONCEPT_ID,Drug,NA,NA +drug_exposure,drug_concept_id,Yes,integer,"The DRUG_CONCEPT_ID field is recommended for primary use in analyses, and must be used for network studies. This is the standard concept mapped from the source concept id which represents a drug product or molecule otherwise introduced to the body. The drug concepts can have a varying degree of information about drug strength and dose. This information is relevant in the context of quantity and administration information in the subsequent fields plus strength information from the DRUG_STRENGTH table, provided as part of the standard vocabulary download.","The CONCEPT_ID that the DRUG_SOURCE_VALUE maps to. The concept id should be derived either from mapping from the source concept id or by picking the drug concept representing the most amount of detail you have. Records whose source values map to standard concepts with a domain of Drug should go in this table. When the Drug Source Value of the code cannot be translated into Standard Drug Concept IDs, a Drug exposure entry is stored with only the corresponding SOURCE_CONCEPT_ID and DRUG_SOURCE_VALUE and a DRUG_CONCEPT_ID of 0. The Drug Concept with the most detailed content of information is preferred during the mapping process. These are indicated in the CONCEPT_CLASS_ID field of the Concept and are recorded in the following order of precedence: �Marketed Product�, �Branded Pack�, �Clinical Pack�, �Branded Drug�, �Clinical Drug�, �Branded Drug Component�, �Clinical Drug Component�, �Branded Drug Form�, �Clinical Drug Form�, and only if no other information is available �Ingredient�. Note: If only the drug class is known, the DRUG_CONCEPT_ID field should contain 0. [Accepted Concepts](https://athena.ohdsi.org/search-terms/terms?domain=Drug&standardConcept=Standard&page=1&pageSize=15&query=).",No,Yes,CONCEPT,CONCEPT_ID,Drug,NA,NA drug_exposure,drug_exposure_start_date,Yes,date,Use this date to determine the start date of the drug record.,"Valid entries include a start date of a prescription, the date a prescription was filled, or the date on which a Drug administration was recorded. It is a valid ETL choice to use the date the drug was ordered as the DRUG_EXPOSURE_START_DATE.",No,No,NA,NA,NA,NA,NA drug_exposure,drug_exposure_start_datetime,No,datetime,NA,"This is not required, though it is in v6. If a source does not specify datetime the convention is to set the time to midnight (00:00:0000)",No,No,NA,NA,NA,NA,NA drug_exposure,drug_exposure_end_date,Yes,date,The DRUG_EXPOSURE_END_DATE denotes the day the drug exposure ended for the patient.,"If this information is not explicitly available in the data, infer the end date using the following methods:

1. Start first with duration or days supply using the calculation drug start date + days supply -1 day. 2. Use quantity divided by daily dose that you may obtain from the sig or a source field (or assumed daily dose of 1) for solid, indivisibile, drug products. If quantity represents ingredient amount, quantity divided by daily dose * concentration (from drug_strength) drug concept id tells you the dose form. 3. If it is an administration record, set drug end date equal to drug start date. If the record is a written prescription then set end date to start date + 29. If the record is a mail-order prescription set end date to start date + 89. The end date must be equal to or greater than the start date. Ibuprofen 20mg/mL oral solution concept tells us this is oral solution. Calculate duration as quantity (200 example) * daily dose (5mL) /concentration (20mg/mL) 200*5/20 = 50 days. [Examples by dose form](https://ohdsi.github.io/CommonDataModel/drug_dose.html)

For detailed conventions for how to populate this field, please see the [THEMIS repository](https://ohdsi.github.io/Themis/tag_drug_exposure.html).",No,No,NA,NA,NA,NA,NA @@ -148,7 +148,7 @@ device_exposure,unit_source_value,No,varchar(50),"This field houses the verbatim device_exposure,unit_source_concept_id,No,integer,"This is the concept representing the UNIT_SOURCE_VALUE and may not necessarily be standard. This field is discouraged from use in analysis because it is not required to contain Standard Concepts that are used across the OHDSI community, and should only be used when Standard Concepts do not adequately represent the source detail for the Unit necessary for a given analytic use case. Consider using UNIT_CONCEPT_ID instead to enable standardized analytics that can be consistent across the network.",If the UNIT_SOURCE_VALUE is coded in the source data using an OMOP supported vocabulary put the concept id representing the source value here.,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA measurement,measurement_id,Yes,integer,The unique key given to a Measurement record for a Person. Refer to the ETL for how duplicate Measurements during the same Visit were handled.,"Each instance of a measurement present in the source data should be assigned this unique key. In some cases, a person can have multiple records of the same measurement within the same visit. It is valid to keep these duplicates and assign them individual, unique, MEASUREMENT_IDs, though it is up to the ETL how they should be handled.",Yes,No,NA,NA,NA,NA,NA measurement,person_id,Yes,integer,The PERSON_ID of the Person for whom the Measurement is recorded. This may be a system generated code.,NA,No,Yes,PERSON,PERSON_ID,NA,NA,NA -measurement,measurement_concept_id,Yes,integer,"The MEASUREMENT_CONCEPT_ID field is recommended for primary use in analyses, and must be used for network studies. This is the standard concept mapped from the source value which represents a measurement.",The CONCEPT_ID that the MEASUREMENT_SOURCE_VALUE maps to. Only records whose source values map to concepts with a domain of Measurement should go in this table.,No,Yes,CONCEPT,CONCEPT_ID,Measurement,NA,NA +measurement,measurement_concept_id,Yes,integer,"The MEASUREMENT_CONCEPT_ID field is recommended for primary use in analyses, and must be used for network studies. This is the standard concept mapped from the source value which represents a measurement.",The CONCEPT_ID that the MEASUREMENT_SOURCE_VALUE maps to. Only records whose source values map to concepts with a domain of �Measurement� should go in this table.,No,Yes,CONCEPT,CONCEPT_ID,Measurement,NA,NA measurement,measurement_date,Yes,date,Use this date to determine the date of the measurement.,"If there are multiple dates in the source data associated with a record such as order_date, draw_date, and result_date, choose the one that is closest to the date the sample was drawn from the patient.",No,No,NA,NA,NA,NA,NA measurement,measurement_datetime,No,datetime,NA,"This is not required, though it is in v6. If a source does not specify datetime the convention is to set the time to midnight (00:00:0000)",No,No,NA,NA,NA,NA,NA measurement,measurement_time,No,varchar(10),NA,This is present for backwards compatibility and will be deprecated in an upcoming version.,No,No,NA,NA,NA,NA,NA @@ -405,8 +405,8 @@ cdm_source,cdm_version_concept_id,Yes,integer,The Concept Id representing the ve cdm_source,vocabulary_version,Yes,varchar(20),Version of the OMOP standardised vocabularies loaded,You can find the version of your Vocabulary using the query: `SELECT vocabulary_version from vocabulary where vocabulary_id = 'None'`,No,No,NA,NA,NA,NA,NA concept,concept_id,Yes,integer,A unique identifier for each Concept across all domains.,NA,Yes,No,NA,NA,NA,NA,NA concept,concept_name,Yes,varchar(255),"An unambiguous, meaningful and descriptive name for the Concept.",NA,No,No,NA,NA,NA,NA,NA -concept,domain_id,Yes,varchar(20),A foreign key to the [DOMAIN](https://ohdsi.github.io/CommonDataModel/cdm531.html#domain) table the Concept belongs to.,NA,No,Yes,DOMAIN,DOMAIN_ID,NA,NA,NA -concept,vocabulary_id,Yes,varchar(20),"A foreign key to the [VOCABULARY](https://ohdsi.github.io/CommonDataModel/cdm531.html#vocabulary) +concept,domain_id,Yes,varchar(20),A foreign key to the [DOMAIN](https://ohdsi.github.io/CommonDataModel/cdm54.html#domain) table the Concept belongs to.,NA,No,Yes,DOMAIN,DOMAIN_ID,NA,NA,NA +concept,vocabulary_id,Yes,varchar(20),"A foreign key to the [VOCABULARY](https://ohdsi.github.io/CommonDataModel/cdm54.html#vocabulary) table indicating from which source the Concept has been adapted.",NA,No,Yes,VOCABULARY,VOCABULARY_ID,NA,NA,NA concept,concept_class_id,Yes,varchar(20),"The attribute or concept class of the @@ -479,7 +479,7 @@ relationship,reverse_relationship_id,Yes,varchar(20),"The identifier for the rel define the reverse relationship between two concepts.",NA,No,No,NA,NA,NA,NA,NA relationship,relationship_concept_id,Yes,integer,"A foreign key that refers to an identifier in -the [CONCEPT](https://ohdsi.github.io/CommonDataModel/cdm531.html#concept) table for the unique +the [CONCEPT](https://ohdsi.github.io/CommonDataModel/cdm54.html#concept) table for the unique relationship concept.",NA,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA concept_synonym,concept_id,Yes,integer,NA,NA,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA concept_synonym,concept_synonym_name,Yes,varchar(1000),NA,NA,No,No,NA,NA,NA,NA,NA diff --git a/inst/csv/OMOP_CDMv5.4_Table_Level.csv b/inst/csv/OMOP_CDMv5.4_Table_Level.csv index b1091f9..a839c65 100644 --- a/inst/csv/OMOP_CDMv5.4_Table_Level.csv +++ b/inst/csv/OMOP_CDMv5.4_Table_Level.csv @@ -1,6 +1,6 @@ -cdmTableName,schema,isRequired,conceptPrefix,measurePersonCompleteness,measurePersonCompletenessThreshold,validation,tableDescription,userGuidance,etlConventions -person,CDM,Yes,NA,No,NA,NA,"This table serves as the central identity management for all Persons in the database. It contains records that uniquely identify each person or patient, and some demographic information.",All records in this table are independent Persons.,"All Persons in a database needs one record in this table, unless they fail data quality requirements specified in the ETL. Persons with no Events should have a record nonetheless. If more than one data source contributes Events to the database, Persons must be reconciled, if possible, across the sources to create one single record per Person. The content of the BIRTH_DATETIME must be equivalent to the content of BIRTH_DAY, BIRTH_MONTH and BIRTH_YEAR.

For detailed conventions for how to populate this table, please refer to the [THEMIS repository](https://ohdsi.github.io/Themis/person.html)." -observation_period,CDM,Yes,NA,Yes,0,NA,"This table contains records which define spans of time during which two conditions are expected to hold: (i) Clinical Events that happened to the Person are recorded in the Event tables, and (ii) absence of records indicate such Events did not occur during this span of time.","For each Person, one or more OBSERVATION_PERIOD records may be present, but they will not overlap or be back to back to each other. Events may exist outside all of the time spans of the OBSERVATION_PERIOD records for a patient, however, absence of an Event outside these time spans cannot be construed as evidence of absence of an Event. Incidence or prevalence rates should only be calculated for the time of active OBSERVATION_PERIOD records. When constructing cohorts, outside Events can be used for inclusion criteria definition, but without any guarantee for the performance of these criteria. Also, OBSERVATION_PERIOD records can be as short as a single day, greatly disturbing the denominator of any rate calculation as part of cohort characterizations. To avoid that, apply minimal observation time as a requirement for any cohort definition.","Each Person needs to have at least one OBSERVATION_PERIOD record, which should represent time intervals with a high capture rate of Clinical Events. Some source data have very similar concepts, such as enrollment periods in insurance claims data. In other source data such as most EHR systems these time spans need to be inferred under a set of assumptions. It is the discretion of the ETL developer to define these assumptions. In many ETL solutions the start date of the first occurrence or the first high quality occurrence of a Clinical Event (Condition, Drug, Procedure, Device, Measurement, Visit) is defined as the start of the OBSERVATION_PERIOD record, and the end date of the last occurrence of last high quality occurrence of a Clinical Event, or the end of the database period becomes the end of the OBSERVATOIN_PERIOD for each Person. If a Person only has a single Clinical Event the OBSERVATION_PERIOD record can be as short as one day. Depending on these definitions it is possible that Clinical Events fall outside the time spans defined by OBSERVATION_PERIOD records. Family history or history of Clinical Events generally are not used to generate OBSERVATION_PERIOD records around the time they are referring to. Any two overlapping or adjacent OBSERVATION_PERIOD records have to be merged into one." +cdmTableName,schema,isRequired,conceptPrefix,measurePersonCompleteness,measurePersonCompletenessThreshold,validation,tableDescription,userGuidance,etlConventions +person,CDM,Yes,NA,No,NA,NA,"This table serves as the central identity management for all Persons in the database. It contains records that uniquely identify each person or patient, and some demographic information.",All records in this table are independent Persons.,"All Persons in a database needs one record in this table, unless they fail data quality requirements specified in the ETL. Persons with no Events should have a record nonetheless. If more than one data source contributes Events to the database, Persons must be reconciled, if possible, across the sources to create one single record per Person. The content of the BIRTH_DATETIME must be equivalent to the content of BIRTH_DAY, BIRTH_MONTH and BIRTH_YEAR.

For detailed conventions for how to populate this table, please refer to the [THEMIS repository](https://ohdsi.github.io/Themis/person.html)." +observation_period,CDM,Yes,NA,Yes,0,NA,"This table contains records which define spans of time during which two conditions are expected to hold: (i) Clinical Events that happened to the Person are recorded in the Event tables, and (ii) absence of records indicate such Events did not occur during this span of time.","For each Person, one or more OBSERVATION_PERIOD records may be present, but they will not overlap or be back to back to each other. Events may exist outside all of the time spans of the OBSERVATION_PERIOD records for a patient, however, absence of an Event outside these time spans cannot be construed as evidence of absence of an Event. Incidence or prevalence rates should only be calculated for the time of active OBSERVATION_PERIOD records. When constructing cohorts, outside Events can be used for inclusion criteria definition, but without any guarantee for the performance of these criteria. Also, OBSERVATION_PERIOD records can be as short as a single day, greatly disturbing the denominator of any rate calculation as part of cohort characterizations. To avoid that, apply minimal observation time as a requirement for any cohort definition.","Each Person needs to have at least one OBSERVATION_PERIOD record, which should represent time intervals with a high capture rate of Clinical Events. Some source data have very similar concepts, such as enrollment periods in insurance claims data. In other source data such as most EHR systems these time spans need to be inferred under a set of assumptions. It is the discretion of the ETL developer to define these assumptions. In many ETL solutions the start date of the first occurrence or the first high quality occurrence of a Clinical Event (Condition, Drug, Procedure, Device, Measurement, Visit) is defined as the start of the OBSERVATION_PERIOD record, and the end date of the last occurrence of last high quality occurrence of a Clinical Event, or the end of the database period becomes the end of the OBSERVATOIN_PERIOD for each Person. If a Person only has a single Clinical Event the OBSERVATION_PERIOD record can be as short as one day. Depending on these definitions it is possible that Clinical Events fall outside the time spans defined by OBSERVATION_PERIOD records. Family history or history of Clinical Events generally are not used to generate OBSERVATION_PERIOD records around the time they are referring to. Any two overlapping or adjacent OBSERVATION_PERIOD records have to be merged into one." visit_occurrence,CDM,No,VISIT_,Yes,0,NA,"This table contains Events where Persons engage with the healthcare system for a duration of time. They are often also called ""Encounters"". Visits are defined by a configuration of circumstances under which they occur, such as (i) whether the patient comes to a healthcare institution, the other way around, or the interaction is remote, (ii) whether and what kind of trained medical staff is delivering the service during the Visit, and (iii) whether the Visit is transient or for a longer period involving a stay in bed.","The configuration defining the Visit are described by Concepts in the Visit Domain, which form a hierarchical structure, but rolling up to generally familiar Visits adopted in most healthcare systems worldwide: - [Inpatient Visit](https://athena.ohdsi.org/search-terms/terms/9201): Person visiting hospital, at a Care Site, in bed, for duration of more than one day, with physicians and other Providers permanently available to deliver service around the clock @@ -15,15 +15,15 @@ visit_occurrence,CDM,No,VISIT_,Yes,0,NA,"This table contains Events where Person - [Ambulance Visit](https://athena.ohdsi.org/search-terms/terms/581478): Person using transportation service for the purpose of initiating one of the other Visits, without a Care Site, within one day, potentially with Providers accompanying the Visit and delivering service - [Case Management Visit](https://athena.ohdsi.org/search-terms/terms/38004193): Person interacting with healthcare system, without a Care Site, within a day, with no Providers involved, for administrative purposes -The Visit duration, or 'length of stay', is defined as VISIT_END_DATE - VISIT_START_DATE. For all Visits this is <1 day, except Inpatient Visits and Non-hospital institution Visits. The CDM also contains the VISIT_DETAIL table where additional information about the Visit is stored, for example, transfers between units during an inpatient Visit.","Visits can be derived easily if the source data contain coding systems for Place of Service or Procedures, like CPT codes for well visits. In those cases, the codes can be looked up and mapped to a Standard Visit Concept. Otherwise, Visit Concepts have to be identified in the ETL process. This table will contain concepts in the Visit domain. These concepts are arranged in a hierarchical structure to facilitate cohort definitions by rolling up to generally familiar Visits adopted in most healthcare systems worldwide. Visits can be adjacent to each other, i.e. the end date of one can be identical with the start date of the other. As a consequence, more than one-day Visits or their descendants can be recorded for the same day. Multi-day visits must not overlap, i.e. share days other than start and end days. It is often the case that some logic should be written for how to define visits and how to assign Visit_Concept_Id. For example, in US claims outpatient visits that appear to occur within the time period of an inpatient visit can be rolled into one with the same Visit_Occurrence_Id. In EHR data inpatient visits that are within one day of each other may be strung together to create one visit. It will all depend on the source data and how encounter records should be translated to visit occurrences. Providers can be associated with a Visit through the PROVIDER_ID field, or indirectly through PROCEDURE_OCCURRENCE records linked both to the VISIT and PROVIDER tables." -visit_detail,CDM,No,VISIT_DETAIL_,Yes,0,NA,The VISIT_DETAIL table is an optional table used to represents details of each record in the parent VISIT_OCCURRENCE table. A good example of this would be the movement between units in a hospital during an inpatient stay or claim lines associated with a one insurance claim. For every record in the VISIT_OCCURRENCE table there may be 0 or more records in the VISIT_DETAIL table with a 1:n relationship where n may be 0. The VISIT_DETAIL table is structurally very similar to VISIT_OCCURRENCE table and belongs to the visit domain.,"The configuration defining the Visit Detail is described by Concepts in the Visit Domain, which form a hierarchical structure. The Visit Detail record will have an associated to the Visit Occurrence record in two ways:
1. The Visit Detail record will have the VISIT_OCCURRENCE_ID it is associated to 2. The VISIT_DETAIL_CONCEPT_ID will be a descendant of the VISIT_CONCEPT_ID for the Visit.","It is not mandatory that the VISIT_DETAIL table be filled in, but if you find that the logic to create VISIT_OCCURRENCE records includes the roll-up of multiple smaller records to create one picture of a Visit then it is a good idea to use VISIT_DETAIL. In EHR data, for example, a Person may be in the hospital but instead of one over-arching Visit their encounters are recorded as times they interacted with a health care provider. A Person in the hospital interacts with multiple providers multiple times a day so the encounters must be strung together using some heuristic (defined by the ETL) to identify the entire Visit. In this case the encounters would be considered Visit Details and the entire Visit would be the Visit Occurrence. In this example it is also possible to use the Vocabulary to distinguish Visit Details from a Visit Occurrence by setting the VISIT_CONCEPT_ID to [9201](https://athena.ohdsi.org/search-terms/terms/9201) and the VISIT_DETAIL_CONCEPT_IDs either to 9201 or its children to indicate where the patient was in the hospital at the time of care." -condition_occurrence,CDM,No,CONDITION_,Yes,0,NA,"This table contains records of Events of a Person suggesting the presence of a disease or medical condition stated as a diagnosis, a sign, or a symptom, which is either observed by a Provider or reported by the patient.","Conditions are defined by Concepts from the Condition domain, which form a complex hierarchy. As a result, the same Person with the same disease may have multiple Condition records, which belong to the same hierarchical family. Most Condition records are mapped from diagnostic codes, but recorded signs, symptoms and summary descriptions also contribute to this table. Rule out diagnoses should not be recorded in this table, but in reality their negating nature is not always captured in the source data, and other precautions must be taken when when identifying Persons who should suffer from the recorded Condition. Record all conditions as they exist in the source data. Any decisions about diagnosis/phenotype definitions would be done through cohort specifications. These cohorts can be housed in the [COHORT](https://ohdsi.github.io/CommonDataModel/cdm531.html#payer_plan_period) table. Conditions span a time interval from start to end, but are typically recorded as single snapshot records with no end date. The reason is twofold: (i) At the time of the recording the duration is not known and later not recorded, and (ii) the Persons typically cease interacting with the healthcare system when they feel better, which leads to incomplete capture of resolved Conditions. The [CONDITION_ERA](https://ohdsi.github.io/CommonDataModel/cdm531.html#condition_era) table addresses this issue. Family history and past diagnoses ('history of') are not recorded in this table. Instead, they are listed in the [OBSERVATION](https://ohdsi.github.io/CommonDataModel/cdm531.html#observation) table. Codes written in the process of establishing the diagnosis, such as 'question of' of and 'rule out', should not represented here. Instead, they should be recorded in the [OBSERVATION](https://ohdsi.github.io/CommonDataModel/cdm531.html#observation) table, if they are used for analyses. However, this information is not always available.",Source codes and source text fields mapped to Standard Concepts of the Condition Domain have to be recorded here. -drug_exposure,CDM,No,DRUG_,Yes,0,NA,"This table captures records about the exposure to a Drug ingested or otherwise introduced into the body. A Drug is a biochemical substance formulated in such a way that when administered to a Person it will exert a certain biochemical effect on the metabolism. Drugs include prescription and over-the-counter medicines, vaccines, and large-molecule biologic therapies. Radiological devices ingested or applied locally do not count as Drugs.","The purpose of records in this table is to indicate an exposure to a certain drug as best as possible. In this context a drug is defined as an active ingredient. Drug Exposures are defined by Concepts from the Drug domain, which form a complex hierarchy. As a result, one DRUG_SOURCE_CONCEPT_ID may map to multiple standard concept ids if it is a combination product. Records in this table represent prescriptions written, prescriptions dispensed, and drugs administered by a provider to name a few. The DRUG_TYPE_CONCEPT_ID can be used to find and filter on these types. This table includes additional information about the drug products, the quantity given, and route of administration.","Information about quantity and dose is provided in a variety of different ways and it is important for the ETL to provide as much information as possible from the data. Depending on the provenance of the data fields may be captured differently i.e. quantity for drugs administered may have a separate meaning from quantity for prescriptions dispensed. If a patient has multiple records on the same day for the same drug or procedures the ETL should not de-dupe them unless there is probable reason to believe the item is a true data duplicate. Take note on how to handle refills for prescriptions written.

For detailed conventions on how to populate this table, please refer to the [THEMIS repository](https://ohdsi.github.io/Themis/drug_exposure.html)." -procedure_occurrence,CDM,No,PROCEDURE_,Yes,0,NA,"This table contains records of activities or processes ordered by, or carried out by, a healthcare provider on the patient with a diagnostic or therapeutic purpose.","Lab tests are not a procedure, if something is observed with an expected resulting amount and unit then it should be a measurement. Phlebotomy is a procedure but so trivial that it tends to be rarely captured. It can be assumed that there is a phlebotomy procedure associated with many lab tests, therefore it is unnecessary to add them as separate procedures. If the user finds the same procedure over concurrent days, it is assumed those records are part of a procedure lasting more than a day. This logic is in lieu of the procedure_end_date, which will be added in a future version of the CDM.","When dealing with duplicate records, the ETL must determine whether to sum them up into one record or keep them separate. Things to consider are: - Same Procedure - Same PROCEDURE_DATETIME - Same Visit Occurrence or Visit Detail - Same Provider - Same Modifier for Procedures. Source codes and source text fields mapped to Standard Concepts of the Procedure Domain have to be recorded here." -device_exposure,CDM,No,DEVICE_,Yes,0,NA,"The Device domain captures information about a person's exposure to a foreign physical object or instrument which is used for diagnostic or therapeutic purposes through a mechanism beyond chemical action. Devices include implantable objects (e.g. pacemakers, stents, artificial joints), medical equipment and supplies (e.g. bandages, crutches, syringes), other instruments used in medical procedures (e.g. sutures, defibrillators) and material used in clinical care (e.g. adhesives, body material, dental material, surgical material).","The distinction between Devices or supplies and Procedures are sometimes blurry, but the former are physical objects while the latter are actions, often to apply a Device or supply.",Source codes and source text fields mapped to Standard Concepts of the Device Domain have to be recorded here. -measurement,CDM,No,MEASUREMENT_,Yes,0,NA,"The MEASUREMENT table contains records of Measurements, i.e. structured values (numerical or categorical) obtained through systematic and standardized examination or testing of a Person or Person's sample. The MEASUREMENT table contains both orders and results of such Measurements as laboratory tests, vital signs, quantitative findings from pathology reports, etc. Measurements are stored as attribute value pairs, with the attribute as the Measurement Concept and the value representing the result. The value can be a Concept (stored in VALUE_AS_CONCEPT), or a numerical value (VALUE_AS_NUMBER) with a Unit (UNIT_CONCEPT_ID). The Procedure for obtaining the sample is housed in the PROCEDURE_OCCURRENCE table, though it is unnecessary to create a PROCEDURE_OCCURRENCE record for each measurement if one does not exist in the source data. Measurements differ from Observations in that they require a standardized test or some other activity to generate a quantitative or qualitative result. If there is no result, it is assumed that the lab test was conducted but the result was not captured.","Measurements are predominately lab tests with a few exceptions, like blood pressure or function tests. Results are given in the form of a value and unit combination. When investigating measurements, look for operator_concept_ids (<, >, etc.).","Only records where the source value maps to a Concept in the measurement domain should be included in this table. Even though each Measurement always has a result, the fields VALUE_AS_NUMBER and VALUE_AS_CONCEPT_ID are not mandatory as often the result is not given in the source data. When the result is not known, the Measurement record represents just the fact that the corresponding Measurement was carried out, which in itself is already useful information for some use cases. For some Measurement Concepts, the result is included in the test. For example, ICD10 CONCEPT_ID [45548980](https://athena.ohdsi.org/search-terms/terms/45548980) 'Abnormal level of unspecified serum enzyme' indicates a Measurement and the result (abnormal). In those situations, the CONCEPT_RELATIONSHIP table in addition to the 'Maps to' record contains a second record with the relationship_id set to 'Maps to value'. In this example, the 'Maps to' relationship directs to [4046263](https://athena.ohdsi.org/search-terms/terms/4046263) 'Enzyme measurement' as well as a 'Maps to value' record to [4135493](https://athena.ohdsi.org/search-terms/terms/4135493) 'Abnormal'." -observation,CDM,No,OBSERVATION_,Yes,0,NA,"The OBSERVATION table captures clinical facts about a Person obtained in the context of examination, questioning or a procedure. Any data that cannot be represented by any other domains, such as social and lifestyle facts, medical history, family history, etc. are recorded here.","Observations differ from Measurements in that they do not require a standardized test or some other activity to generate clinical fact. Typical observations are medical history, family history, the stated need for certain treatment, social circumstances, lifestyle choices, healthcare utilization patterns, etc. If the generation clinical facts requires a standardized testing such as lab testing or imaging and leads to a standardized result, the data item is recorded in the MEASUREMENT table. If the clinical fact observed determines a sign, symptom, diagnosis of a disease or other medical condition, it is recorded in the CONDITION_OCCURRENCE table. Valid Observation Concepts are not enforced to be from any domain but they must not belong to the Condition, Procedure, Drug, Device, Specimen, or Measurement domains and they must be Standard Concepts.

The observation table usually records the date or datetime of when the observation was obtained, not the date of the observation starting. For example, if the patient reports that they had a heart attack when they were 50, the observation date or datetime is the date of the report, the heart attack observation can have a value_as_concept which captures how long ago the observation applied to the patient.","Records whose Source Values map to any domain besides Condition, Procedure, Drug, Specimen, Measurement or Device should be stored in the Observation table. Observations can be stored as attribute value pairs, with the attribute as the Observation Concept and the value representing the clinical fact. This fact can be a Concept (stored in VALUE_AS_CONCEPT), a numerical value (VALUE_AS_NUMBER), a verbatim string (VALUE_AS_STRING), or a datetime (VALUE_AS_DATETIME). Even though Observations do not have an explicit result, the clinical fact can be stated separately from the type of Observation in the VALUE_AS_* fields. It is recommended for Observations that are suggestive statements of positive assertion should have a value of 'Yes' (concept_id=4188539), recorded, even though the null value is the equivalent." -death,CDM,No,NA,No,NA,NA,"The death domain contains the clinical event for how and when a Person dies. A person can have up to one record if the source system contains evidence about the Death, such as: Condition in an administrative claim, status of enrollment into a health plan, or explicit record in EHR data.",NA,"For specific conventions on how to populate this table, please refer to the [THEMIS repository](https://ohdsi.github.io/Themis/death.html)." +The Visit duration, or 'length of stay', is defined as VISIT_END_DATE - VISIT_START_DATE. For all Visits this is <1 day, except Inpatient Visits and Non-hospital institution Visits. The CDM also contains the VISIT_DETAIL table where additional information about the Visit is stored, for example, transfers between units during an inpatient Visit.","Visits can be derived easily if the source data contain coding systems for Place of Service or Procedures, like CPT codes for well visits. In those cases, the codes can be looked up and mapped to a Standard Visit Concept. Otherwise, Visit Concepts have to be identified in the ETL process. This table will contain concepts in the Visit domain. These concepts are arranged in a hierarchical structure to facilitate cohort definitions by rolling up to generally familiar Visits adopted in most healthcare systems worldwide. Visits can be adjacent to each other, i.e. the end date of one can be identical with the start date of the other. As a consequence, more than one-day Visits or their descendants can be recorded for the same day. Multi-day visits must not overlap, i.e. share days other than start and end days. It is often the case that some logic should be written for how to define visits and how to assign Visit_Concept_Id. For example, in US claims outpatient visits that appear to occur within the time period of an inpatient visit can be rolled into one with the same Visit_Occurrence_Id. In EHR data inpatient visits that are within one day of each other may be strung together to create one visit. It will all depend on the source data and how encounter records should be translated to visit occurrences. Providers can be associated with a Visit through the PROVIDER_ID field, or indirectly through PROCEDURE_OCCURRENCE records linked both to the VISIT and PROVIDER tables." +visit_detail,CDM,No,VISIT_DETAIL_,Yes,0,NA,The VISIT_DETAIL table is an optional table used to represents details of each record in the parent VISIT_OCCURRENCE table. A good example of this would be the movement between units in a hospital during an inpatient stay or claim lines associated with a one insurance claim. For every record in the VISIT_OCCURRENCE table there may be 0 or more records in the VISIT_DETAIL table with a 1:n relationship where n may be 0. The VISIT_DETAIL table is structurally very similar to VISIT_OCCURRENCE table and belongs to the visit domain.,"The configuration defining the Visit Detail is described by Concepts in the Visit Domain, which form a hierarchical structure. The Visit Detail record will have an associated to the Visit Occurrence record in two ways:
1. The Visit Detail record will have the VISIT_OCCURRENCE_ID it is associated to 2. The VISIT_DETAIL_CONCEPT_ID will be a descendant of the VISIT_CONCEPT_ID for the Visit.","It is not mandatory that the VISIT_DETAIL table be filled in, but if you find that the logic to create VISIT_OCCURRENCE records includes the roll-up of multiple smaller records to create one picture of a Visit then it is a good idea to use VISIT_DETAIL. In EHR data, for example, a Person may be in the hospital but instead of one over-arching Visit their encounters are recorded as times they interacted with a health care provider. A Person in the hospital interacts with multiple providers multiple times a day so the encounters must be strung together using some heuristic (defined by the ETL) to identify the entire Visit. In this case the encounters would be considered Visit Details and the entire Visit would be the Visit Occurrence. In this example it is also possible to use the Vocabulary to distinguish Visit Details from a Visit Occurrence by setting the VISIT_CONCEPT_ID to [9201](https://athena.ohdsi.org/search-terms/terms/9201) and the VISIT_DETAIL_CONCEPT_IDs either to 9201 or its children to indicate where the patient was in the hospital at the time of care." +condition_occurrence,CDM,No,CONDITION_,Yes,0,NA,"This table contains records of Events of a Person suggesting the presence of a disease or medical condition stated as a diagnosis, a sign, or a symptom, which is either observed by a Provider or reported by the patient.","Conditions are defined by Concepts from the Condition domain, which form a complex hierarchy. As a result, the same Person with the same disease may have multiple Condition records, which belong to the same hierarchical family. Most Condition records are mapped from diagnostic codes, but recorded signs, symptoms and summary descriptions also contribute to this table. Rule out diagnoses should not be recorded in this table, but in reality their negating nature is not always captured in the source data, and other precautions must be taken when when identifying Persons who should suffer from the recorded Condition. Record all conditions as they exist in the source data. Any decisions about diagnosis/phenotype definitions would be done through cohort specifications. These cohorts can be housed in the [COHORT](https://ohdsi.github.io/CommonDataModel/cdm54.html#payer_plan_period) table. Conditions span a time interval from start to end, but are typically recorded as single snapshot records with no end date. The reason is twofold: (i) At the time of the recording the duration is not known and later not recorded, and (ii) the Persons typically cease interacting with the healthcare system when they feel better, which leads to incomplete capture of resolved Conditions. The [CONDITION_ERA](https://ohdsi.github.io/CommonDataModel/cdm54.html#condition_era) table addresses this issue. Family history and past diagnoses ('history of') are not recorded in this table. Instead, they are listed in the [OBSERVATION](https://ohdsi.github.io/CommonDataModel/cdm54.html#observation) table. Codes written in the process of establishing the diagnosis, such as 'question of' of and 'rule out', should not represented here. Instead, they should be recorded in the [OBSERVATION](https://ohdsi.github.io/CommonDataModel/cdm54.html#observation) table, if they are used for analyses. However, this information is not always available.",Source codes and source text fields mapped to Standard Concepts of the Condition Domain have to be recorded here. +drug_exposure,CDM,No,DRUG_,Yes,0,NA,"This table captures records about the exposure to a Drug ingested or otherwise introduced into the body. A Drug is a biochemical substance formulated in such a way that when administered to a Person it will exert a certain biochemical effect on the metabolism. Drugs include prescription and over-the-counter medicines, vaccines, and large-molecule biologic therapies. Radiological devices ingested or applied locally do not count as Drugs.","The purpose of records in this table is to indicate an exposure to a certain drug as best as possible. In this context a drug is defined as an active ingredient. Drug Exposures are defined by Concepts from the Drug domain, which form a complex hierarchy. As a result, one DRUG_SOURCE_CONCEPT_ID may map to multiple standard concept ids if it is a combination product. Records in this table represent prescriptions written, prescriptions dispensed, and drugs administered by a provider to name a few. The DRUG_TYPE_CONCEPT_ID can be used to find and filter on these types. This table includes additional information about the drug products, the quantity given, and route of administration.","Information about quantity and dose is provided in a variety of different ways and it is important for the ETL to provide as much information as possible from the data. Depending on the provenance of the data fields may be captured differently i.e. quantity for drugs administered may have a separate meaning from quantity for prescriptions dispensed. If a patient has multiple records on the same day for the same drug or procedures the ETL should not de-dupe them unless there is probable reason to believe the item is a true data duplicate. Take note on how to handle refills for prescriptions written.

For detailed conventions on how to populate this table, please refer to the [THEMIS repository](https://ohdsi.github.io/Themis/drug_exposure.html)." +procedure_occurrence,CDM,No,PROCEDURE_,Yes,0,NA,"This table contains records of activities or processes ordered by, or carried out by, a healthcare provider on the patient with a diagnostic or therapeutic purpose.","Lab tests are not a procedure, if something is observed with an expected resulting amount and unit then it should be a measurement. Phlebotomy is a procedure but so trivial that it tends to be rarely captured. It can be assumed that there is a phlebotomy procedure associated with many lab tests, therefore it is unnecessary to add them as separate procedures. If the user finds the same procedure over concurrent days, it is assumed those records are part of a procedure lasting more than a day. This logic is in lieu of the procedure_end_date, which will be added in a future version of the CDM.","When dealing with duplicate records, the ETL must determine whether to sum them up into one record or keep them separate. Things to consider are: - Same Procedure - Same PROCEDURE_DATETIME - Same Visit Occurrence or Visit Detail - Same Provider - Same Modifier for Procedures. Source codes and source text fields mapped to Standard Concepts of the Procedure Domain have to be recorded here." +device_exposure,CDM,No,DEVICE_,Yes,0,NA,"The Device domain captures information about a person's exposure to a foreign physical object or instrument which is used for diagnostic or therapeutic purposes through a mechanism beyond chemical action. Devices include implantable objects (e.g. pacemakers, stents, artificial joints), medical equipment and supplies (e.g. bandages, crutches, syringes), other instruments used in medical procedures (e.g. sutures, defibrillators) and material used in clinical care (e.g. adhesives, body material, dental material, surgical material).","The distinction between Devices or supplies and Procedures are sometimes blurry, but the former are physical objects while the latter are actions, often to apply a Device or supply.",Source codes and source text fields mapped to Standard Concepts of the Device Domain have to be recorded here. +measurement,CDM,No,MEASUREMENT_,Yes,0,NA,"The MEASUREMENT table contains records of Measurements, i.e. structured values (numerical or categorical) obtained through systematic and standardized examination or testing of a Person or Person's sample. The MEASUREMENT table contains both orders and results of such Measurements as laboratory tests, vital signs, quantitative findings from pathology reports, etc. Measurements are stored as attribute value pairs, with the attribute as the Measurement Concept and the value representing the result. The value can be a Concept (stored in VALUE_AS_CONCEPT), or a numerical value (VALUE_AS_NUMBER) with a Unit (UNIT_CONCEPT_ID). The Procedure for obtaining the sample is housed in the PROCEDURE_OCCURRENCE table, though it is unnecessary to create a PROCEDURE_OCCURRENCE record for each measurement if one does not exist in the source data. Measurements differ from Observations in that they require a standardized test or some other activity to generate a quantitative or qualitative result. If there is no result, it is assumed that the lab test was conducted but the result was not captured.","Measurements are predominately lab tests with a few exceptions, like blood pressure or function tests. Results are given in the form of a value and unit combination. When investigating measurements, look for operator_concept_ids (<, >, etc.).","Only records where the source value maps to a Concept in the measurement domain should be included in this table. Even though each Measurement always has a result, the fields VALUE_AS_NUMBER and VALUE_AS_CONCEPT_ID are not mandatory as often the result is not given in the source data. When the result is not known, the Measurement record represents just the fact that the corresponding Measurement was carried out, which in itself is already useful information for some use cases. For some Measurement Concepts, the result is included in the test. For example, ICD10 CONCEPT_ID [45548980](https://athena.ohdsi.org/search-terms/terms/45548980) 'Abnormal level of unspecified serum enzyme' indicates a Measurement and the result (abnormal). In those situations, the CONCEPT_RELATIONSHIP table in addition to the 'Maps to' record contains a second record with the relationship_id set to 'Maps to value'. In this example, the 'Maps to' relationship directs to [4046263](https://athena.ohdsi.org/search-terms/terms/4046263) 'Enzyme measurement' as well as a 'Maps to value' record to [4135493](https://athena.ohdsi.org/search-terms/terms/4135493) 'Abnormal'." +observation,CDM,No,OBSERVATION_,Yes,0,NA,"The OBSERVATION table captures clinical facts about a Person obtained in the context of examination, questioning or a procedure. Any data that cannot be represented by any other domains, such as social and lifestyle facts, medical history, family history, etc. are recorded here.","Observations differ from Measurements in that they do not require a standardized test or some other activity to generate clinical fact. Typical observations are medical history, family history, the stated need for certain treatment, social circumstances, lifestyle choices, healthcare utilization patterns, etc. If the generation clinical facts requires a standardized testing such as lab testing or imaging and leads to a standardized result, the data item is recorded in the MEASUREMENT table. If the clinical fact observed determines a sign, symptom, diagnosis of a disease or other medical condition, it is recorded in the CONDITION_OCCURRENCE table. Valid Observation Concepts are not enforced to be from any domain but they must not belong to the Condition, Procedure, Drug, Device, Specimen, or Measurement domains and they must be Standard Concepts.

The observation table usually records the date or datetime of when the observation was obtained, not the date of the observation starting. For example, if the patient reports that they had a heart attack when they were 50, the observation date or datetime is the date of the report, the heart attack observation can have a value_as_concept which captures how long ago the observation applied to the patient.","Records whose Source Values map to any domain besides Condition, Procedure, Drug, Specimen, Measurement or Device should be stored in the Observation table. Observations can be stored as attribute value pairs, with the attribute as the Observation Concept and the value representing the clinical fact. This fact can be a Concept (stored in VALUE_AS_CONCEPT), a numerical value (VALUE_AS_NUMBER), a verbatim string (VALUE_AS_STRING), or a datetime (VALUE_AS_DATETIME). Even though Observations do not have an explicit result, the clinical fact can be stated separately from the type of Observation in the VALUE_AS_* fields. It is recommended for Observations that are suggestive statements of positive assertion should have a value of 'Yes' (concept_id=4188539), recorded, even though the null value is the equivalent." +death,CDM,No,NA,No,NA,NA,"The death domain contains the clinical event for how and when a Person dies. A person can have up to one record if the source system contains evidence about the Death, such as: Condition in an administrative claim, status of enrollment into a health plan, or explicit record in EHR data.",NA,"For specific conventions on how to populate this table, please refer to the [THEMIS repository](https://ohdsi.github.io/Themis/death.html)." note,CDM,No,NA,Yes,0,NA,"The NOTE table captures unstructured information that was recorded by a provider about a patient in free text (in ASCII, or preferably in UTF8 format) notes on a given date. The type of note_text is CLOB or varchar(MAX) depending on RDBMS.",NA,"HL7/LOINC CDO is a standard for consistent naming of documents to support a range of use cases: retrieval, organization, display, and exchange. It guides the creation of LOINC codes for clinical notes. CDO annotates each document with 5 dimensions: - **Kind of Document**: Characterizes the general structure of the document at a macro level (e.g. Anesthesia Consent) @@ -34,21 +34,21 @@ note,CDM,No,NA,Yes,0,NA,"The NOTE table captures unstructured information that w Each combination of these 5 dimensions rolls up to a unique LOINC code. According to CDO requirements, only 2 of the 5 dimensions are required to properly annotate a document; Kind of Document and any one of the other 4 dimensions. -However, not all the permutations of the CDO dimensions will necessarily yield an existing LOINC code. Each of these dimensions are contained in the OMOP Vocabulary under the domain of 'Meas Value' with each dimension represented as a Concept Class." -note_nlp,CDM,No,NA,No,NA,NA,The NOTE_NLP table encodes all output of NLP on clinical notes. Each row represents a single extracted term from a note.,NA,NA -specimen,CDM,No,SPECIMEN_,Yes,0,NA,The specimen domain contains the records identifying biological samples from a person.,NA,"Anatomic site is coded at the most specific level of granularity possible, such that higher level classifications can be derived using the Standardized Vocabularies." +However, not all the permutations of the CDO dimensions will necessarily yield an existing LOINC code. Each of these dimensions are contained in the OMOP Vocabulary under the domain of 'Meas Value' with each dimension represented as a Concept Class." +note_nlp,CDM,No,NA,No,NA,NA,The NOTE_NLP table encodes all output of NLP on clinical notes. Each row represents a single extracted term from a note.,NA,NA +specimen,CDM,No,SPECIMEN_,Yes,0,NA,The specimen domain contains the records identifying biological samples from a person.,NA,"Anatomic site is coded at the most specific level of granularity possible, such that higher level classifications can be derived using the Standardized Vocabularies." fact_relationship,CDM,No,NA,No,NA,NA,"The FACT_RELATIONSHIP table contains records about the relationships between facts stored as records in any table of the CDM. Relationships can be defined between facts from the same domain, or different domains. Examples of Fact Relationships include: [Person relationships](https://athena.ohdsi.org/search-terms/terms?domain=Relationship&standardConcept=Standard&page=2&pageSize=15&query=) (parent-child), care site relationships (hierarchical organizational structure of facilities within a health system), indication relationship (between drug exposures and associated conditions), usage relationships (of devices during the course of an associated procedure), or facts derived from one another (measurements derived from an associated specimen).",NA,"All relationships are directional, and each relationship is represented twice symmetrically within the FACT_RELATIONSHIP table. For example, two persons if person_id = 1 is the mother of person_id = 2 two records are in the FACT_RELATIONSHIP table (all strings in fact concept_id records in the Concept table: - Person, 1, Person, 2, parent of -- Person, 2, Person, 1, child of" -location,CDM,No,NA,No,NA,NA,The LOCATION table represents a generic way to capture physical location or address information of Persons and Care Sites.,"The current iteration of the LOCATION table is US centric. Until a major release to correct this, certain fields can be used to represent different international values.

- STATE can also be used for province or district
- ZIP is also the postal code or postcode
- COUNTY can also be used to represent region","Each address or Location is unique and is present only once in the table. Locations do not contain names, such as the name of a hospital. In order to construct a full address that can be used in the postal service, the address information from the Location needs to be combined with information from the Care Site." -care_site,CDM,No,NA,No,NA,NA,"The CARE_SITE table contains a list of uniquely identified institutional (physical or organizational) units where healthcare delivery is practiced (offices, wards, hospitals, clinics, etc.).",NA,"Care site is a unique combination of location_id and nature of the site - the latter could be the place of service, name, or another characteristic in your source data. Care site does not take into account the provider (human) information such a specialty. Many source data do not make a distinction between individual and institutional providers. The CARE_SITE table contains the institutional providers. If the source, instead of uniquely identifying individual Care Sites, only provides limited information such as Place of Service, generic or ""pooled"" Care Site records are listed in the CARE_SITE table. There can be hierarchical and business relationships between Care Sites. For example, wards can belong to clinics or departments, which can in turn belong to hospitals, which in turn can belong to hospital systems, which in turn can belong to HMOs.The relationships between Care Sites are defined in the FACT_RELATIONSHIP table.

For additional detailed conventions on how to populate this table, please refer to [THEMIS repository](https://ohdsi.github.io/Themis/care_site.html)." -provider,CDM,No,NA,No,NA,NA,"The PROVIDER table contains a list of uniquely identified healthcare providers; duplication is not allowed. These are individuals providing hands-on healthcare to patients, such as physicians, nurses, midwives, physical therapists etc.","Many sources do not make a distinction between individual and institutional providers. The PROVIDER table contains the individual providers. If the source only provides limited information such as specialty instead of uniquely identifying individual providers, generic or 'pooled' Provider records are listed in the PROVIDER table.",NA -payer_plan_period,CDM,No,NA,Yes,0,NA,"The PAYER_PLAN_PERIOD table captures details of the period of time that a Person is continuously enrolled under a specific health Plan benefit structure from a given Payer. Each Person receiving healthcare is typically covered by a health benefit plan, which pays for (fully or partially), or directly provides, the care. These benefit plans are provided by payers, such as health insurances or state or government agencies. In each plan the details of the health benefits are defined for the Person or her family, and the health benefit Plan might change over time typically with increasing utilization (reaching certain cost thresholds such as deductibles), plan availability and purchasing choices of the Person. The unique combinations of Payer organizations, health benefit Plans and time periods in which they are valid for a Person are recorded in this table.","A Person can have multiple, overlapping, Payer_Plan_Periods in this table. For example, medical and drug coverage in the US can be represented by two Payer_Plan_Periods. The details of the benefit structure of the Plan is rarely known, the idea is just to identify that the Plans are different.",NA +- Person, 2, Person, 1, child of" +location,CDM,No,NA,No,NA,NA,The LOCATION table represents a generic way to capture physical location or address information of Persons and Care Sites.,"The current iteration of the LOCATION table is US centric. Until a major release to correct this, certain fields can be used to represent different international values.

- STATE can also be used for province or district
- ZIP is also the postal code or postcode
- COUNTY can also be used to represent region","Each address or Location is unique and is present only once in the table. Locations do not contain names, such as the name of a hospital. In order to construct a full address that can be used in the postal service, the address information from the Location needs to be combined with information from the Care Site." +care_site,CDM,No,NA,No,NA,NA,"The CARE_SITE table contains a list of uniquely identified institutional (physical or organizational) units where healthcare delivery is practiced (offices, wards, hospitals, clinics, etc.).",NA,"Care site is a unique combination of location_id and nature of the site - the latter could be the place of service, name, or another characteristic in your source data. Care site does not take into account the provider (human) information such a specialty. Many source data do not make a distinction between individual and institutional providers. The CARE_SITE table contains the institutional providers. If the source, instead of uniquely identifying individual Care Sites, only provides limited information such as Place of Service, generic or ""pooled"" Care Site records are listed in the CARE_SITE table. There can be hierarchical and business relationships between Care Sites. For example, wards can belong to clinics or departments, which can in turn belong to hospitals, which in turn can belong to hospital systems, which in turn can belong to HMOs.The relationships between Care Sites are defined in the FACT_RELATIONSHIP table.

For additional detailed conventions on how to populate this table, please refer to [THEMIS repository](https://ohdsi.github.io/Themis/care_site.html)." +provider,CDM,No,NA,No,NA,NA,"The PROVIDER table contains a list of uniquely identified healthcare providers; duplication is not allowed. These are individuals providing hands-on healthcare to patients, such as physicians, nurses, midwives, physical therapists etc.","Many sources do not make a distinction between individual and institutional providers. The PROVIDER table contains the individual providers. If the source only provides limited information such as specialty instead of uniquely identifying individual providers, generic or 'pooled' Provider records are listed in the PROVIDER table.",NA +payer_plan_period,CDM,No,NA,Yes,0,NA,"The PAYER_PLAN_PERIOD table captures details of the period of time that a Person is continuously enrolled under a specific health Plan benefit structure from a given Payer. Each Person receiving healthcare is typically covered by a health benefit plan, which pays for (fully or partially), or directly provides, the care. These benefit plans are provided by payers, such as health insurances or state or government agencies. In each plan the details of the health benefits are defined for the Person or her family, and the health benefit Plan might change over time typically with increasing utilization (reaching certain cost thresholds such as deductibles), plan availability and purchasing choices of the Person. The unique combinations of Payer organizations, health benefit Plans and time periods in which they are valid for a Person are recorded in this table.","A Person can have multiple, overlapping, Payer_Plan_Periods in this table. For example, medical and drug coverage in the US can be represented by two Payer_Plan_Periods. The details of the benefit structure of the Plan is rarely known, the idea is just to identify that the Plans are different.",NA cost,CDM,No,NA,No,NA,NA,"The COST table captures records containing the cost of any medical event recorded in one of the OMOP clinical event tables such as DRUG_EXPOSURE, PROCEDURE_OCCURRENCE, VISIT_OCCURRENCE, VISIT_DETAIL, DEVICE_OCCURRENCE, OBSERVATION or MEASUREMENT. -Each record in the cost table account for the amount of money transacted for the clinical event. So, the COST table may be used to represent both receivables (charges) and payments (paid), each transaction type represented by its COST_CONCEPT_ID. The COST_TYPE_CONCEPT_ID field will use concepts in the Standardized Vocabularies to designate the source (provenance) of the cost data. A reference to the health plan information in the PAYER_PLAN_PERIOD table is stored in the record for information used for the adjudication system to determine the persons benefit for the clinical event.","When dealing with summary costs, the cost of the goods or services the provider provides is often not known directly, but derived from the hospital charges multiplied by an average cost-to-charge ratio.","One cost record is generated for each response by a payer. In a claims databases, the payment and payment terms reported by the payer for the goods or services billed will generate one cost record. If the source data has payment information for more than one payer (i.e. primary insurance and secondary insurance payment for one entity), then a cost record is created for each reporting payer. Therefore, it is possible for one procedure to have multiple cost records for each payer, but typically it contains one or no record per entity. Payer reimbursement cost records will be identified by using the PAYER_PLAN_ID field. Drug costs are composed of ingredient cost (the amount charged by the wholesale distributor or manufacturer), the dispensing fee (the amount charged by the pharmacy and the sales tax)." -drug_era,CDM,No,NA,Yes,0,NA,"A Drug Era is defined as a span of time when the Person is assumed to be exposed to a particular active ingredient. A Drug Era is not the same as a Drug Exposure: Exposures are individual records corresponding to the source when Drug was delivered to the Person, while successive periods of Drug Exposures are combined under certain rules to produce continuous Drug Eras. Every record in the DRUG_EXPOSURE table should be part of a drug era based on the dates of exposure. ",NA,The SQL script for generating DRUG_ERA records can be found [here](https://ohdsi.github.io/CommonDataModel/sqlScripts.html#drug_eras). -dose_era,CDM,No,NA,Yes,0,NA,A Dose Era is defined as a span of time when the Person is assumed to be exposed to a constant dose of a specific active ingredient.,NA,"Dose Eras will be derived from records in the DRUG_EXPOSURE table and the Dose information from the DRUG_STRENGTH table using a standardized algorithm. Dose Form information is not taken into account. So, if the patient changes between different formulations, or different manufacturers with the same formulation, the Dose Era is still spanning the entire time of exposure to the Ingredient." +Each record in the cost table account for the amount of money transacted for the clinical event. So, the COST table may be used to represent both receivables (charges) and payments (paid), each transaction type represented by its COST_CONCEPT_ID. The COST_TYPE_CONCEPT_ID field will use concepts in the Standardized Vocabularies to designate the source (provenance) of the cost data. A reference to the health plan information in the PAYER_PLAN_PERIOD table is stored in the record for information used for the adjudication system to determine the persons benefit for the clinical event.","When dealing with summary costs, the cost of the goods or services the provider provides is often not known directly, but derived from the hospital charges multiplied by an average cost-to-charge ratio.","One cost record is generated for each response by a payer. In a claims databases, the payment and payment terms reported by the payer for the goods or services billed will generate one cost record. If the source data has payment information for more than one payer (i.e. primary insurance and secondary insurance payment for one entity), then a cost record is created for each reporting payer. Therefore, it is possible for one procedure to have multiple cost records for each payer, but typically it contains one or no record per entity. Payer reimbursement cost records will be identified by using the PAYER_PLAN_ID field. Drug costs are composed of ingredient cost (the amount charged by the wholesale distributor or manufacturer), the dispensing fee (the amount charged by the pharmacy and the sales tax)." +drug_era,CDM,No,NA,Yes,0,NA,"A Drug Era is defined as a span of time when the Person is assumed to be exposed to a particular active ingredient. A Drug Era is not the same as a Drug Exposure: Exposures are individual records corresponding to the source when Drug was delivered to the Person, while successive periods of Drug Exposures are combined under certain rules to produce continuous Drug Eras. Every record in the DRUG_EXPOSURE table should be part of a drug era based on the dates of exposure. ",NA,The SQL script for generating DRUG_ERA records can be found [here](https://ohdsi.github.io/CommonDataModel/sqlScripts.html#drug_eras). +dose_era,CDM,No,NA,Yes,0,NA,A Dose Era is defined as a span of time when the Person is assumed to be exposed to a constant dose of a specific active ingredient.,NA,"Dose Eras will be derived from records in the DRUG_EXPOSURE table and the Dose information from the DRUG_STRENGTH table using a standardized algorithm. Dose Form information is not taken into account. So, if the patient changes between different formulations, or different manufacturers with the same formulation, the Dose Era is still spanning the entire time of exposure to the Ingredient." condition_era,CDM,No,NA,Yes,0,NA,"A Condition Era is defined as a span of time when the Person is assumed to have a given condition. Similar to Drug Eras, Condition Eras are chronological periods of Condition Occurrence and every Condition Occurrence record should be part of a Condition Era. Combining individual Condition Occurrences into a single Condition Era serves two purposes: - It allows aggregation of chronic conditions that require frequent ongoing care, instead of treating each Condition Occurrence as an independent event. @@ -56,25 +56,25 @@ condition_era,CDM,No,NA,Yes,0,NA,"A Condition Era is defined as a span of time w For example, consider a Person who visits her Primary Care Physician (PCP) and who is referred to a specialist. At a later time, the Person visits the specialist, who confirms the PCP's original diagnosis and provides the appropriate treatment to resolve the condition. These two independent doctor visits should be aggregated into one Condition Era.",NA,"Each Condition Era corresponds to one or many Condition Occurrence records that form a continuous interval. The condition_concept_id field contains Concepts that are identical to those of the CONDITION_OCCURRENCE table records that make up the Condition Era. In contrast to Drug Eras, Condition Eras are not aggregated to contain Conditions of different hierarchical layers. The SQl Script for generating CONDITION_ERA records can be found [here](https://ohdsi.github.io/CommonDataModel/sqlScripts.html#condition_eras) The Condition Era Start Date is the start date of the first Condition Occurrence. -The Condition Era End Date is the end date of the last Condition Occurrence. Condition Eras are built with a Persistence Window of 30 days, meaning, if no occurrence of the same condition_concept_id happens within 30 days of any one occurrence, it will be considered the condition_era_end_date." -episode,CDM,No,NA,No,NA,NA,"The EPISODE table aggregates lower-level clinical events (VISIT_OCCURRENCE, DRUG_EXPOSURE, PROCEDURE_OCCURRENCE, DEVICE_EXPOSURE) into a higher-level abstraction representing clinically and analytically relevant disease phases,outcomes and treatments. The EPISODE_EVENT table connects qualifying clinical events (VISIT_OCCURRENCE, DRUG_EXPOSURE, PROCEDURE_OCCURRENCE, DEVICE_EXPOSURE) to the appropriate EPISODE entry. For example cancers including their development over time, their treatment, and final resolution.","Valid Episode Concepts belong to the 'Episode' domain. For cancer episodes please see [article], for non-cancer episodes please see [article]. If your source data does not have all episodes that are relevant to the therapeutic area, write only those you can easily derive from the data. It is understood that that table is not currently expected to be comprehensive.",NA -episode_event,CDM,No,NA,No,NA,NA,"The EPISODE_EVENT table connects qualifying clinical events (such as CONDITION_OCCURRENCE, DRUG_EXPOSURE, PROCEDURE_OCCURRENCE, MEASUREMENT) to the appropriate EPISODE entry. For example, linking the precise location of the metastasis (cancer modifier in MEASUREMENT) to the disease episode.",This connecting table is used instead of the FACT_RELATIONSHIP table for linking low-level events to abstracted Episodes.,"Some episodes may not have links to any underlying clinical events. For such episodes, the EPISODE_EVENT table is not populated." -metadata,CDM,No,NA,No,NA,NA,The METADATA table contains metadata information about a dataset that has been transformed to the OMOP Common Data Model.,NA,NA -cdm_source,CDM,No,NA,No,NA,NA,The CDM_SOURCE table contains detail about the source database and the process used to transform the data into the OMOP Common Data Model.,NA,NA +The Condition Era End Date is the end date of the last Condition Occurrence. Condition Eras are built with a Persistence Window of 30 days, meaning, if no occurrence of the same condition_concept_id happens within 30 days of any one occurrence, it will be considered the condition_era_end_date." +episode,CDM,No,NA,No,NA,NA,"The EPISODE table aggregates lower-level clinical events (VISIT_OCCURRENCE, DRUG_EXPOSURE, PROCEDURE_OCCURRENCE, DEVICE_EXPOSURE) into a higher-level abstraction representing clinically and analytically relevant disease phases,outcomes and treatments. The EPISODE_EVENT table connects qualifying clinical events (VISIT_OCCURRENCE, DRUG_EXPOSURE, PROCEDURE_OCCURRENCE, DEVICE_EXPOSURE) to the appropriate EPISODE entry. For example cancers including their development over time, their treatment, and final resolution.","Valid Episode Concepts belong to the 'Episode' domain. For cancer episodes please see [article], for non-cancer episodes please see [article]. If your source data does not have all episodes that are relevant to the therapeutic area, write only those you can easily derive from the data. It is understood that that table is not currently expected to be comprehensive.",NA +episode_event,CDM,No,NA,No,NA,NA,"The EPISODE_EVENT table connects qualifying clinical events (such as CONDITION_OCCURRENCE, DRUG_EXPOSURE, PROCEDURE_OCCURRENCE, MEASUREMENT) to the appropriate EPISODE entry. For example, linking the precise location of the metastasis (cancer modifier in MEASUREMENT) to the disease episode.",This connecting table is used instead of the FACT_RELATIONSHIP table for linking low-level events to abstracted Episodes.,"Some episodes may not have links to any underlying clinical events. For such episodes, the EPISODE_EVENT table is not populated." +metadata,CDM,No,NA,No,NA,NA,The METADATA table contains metadata information about a dataset that has been transformed to the OMOP Common Data Model.,NA,NA +cdm_source,CDM,No,NA,No,NA,NA,The CDM_SOURCE table contains detail about the source database and the process used to transform the data into the OMOP Common Data Model.,NA,NA concept,VOCAB,No,NA,No,NA,NA,"The Standardized Vocabularies contains records, or Concepts, that uniquely identify each fundamental unit of meaning used to express clinical information in all domain tables of the CDM. Concepts are derived from vocabularies, which represent clinical information across a domain (e.g. conditions, drugs, procedures) through the use of codes and associated descriptions. Some Concepts are designated Standard Concepts, meaning these Concepts can be used as normative expressions of a clinical entity within the OMOP Common Data Model and standardized analytics. Each Standard Concept belongs to one Domain, which defines the location where the Concept would be expected to occur within the data tables of the CDM. Concepts can represent broad categories ('Cardiovascular disease'), detailed clinical elements ('Myocardial infarction of the anterolateral wall'), or modifying characteristics and attributes that define Concepts at various levels of detail (severity of a disease, associated morphology, etc.). Records in the Standardized Vocabularies tables are derived from national or international vocabularies such as SNOMED-CT, RxNorm, and LOINC, or custom OMOP Concepts defined to cover various aspects of observational data analysis. ","The primary purpose of the CONCEPT table is to provide a standardized representation of medical Concepts, allowing for consistent querying and analysis across the healthcare databases. -Users can join the CONCEPT table with other tables in the CDM to enrich clinical data with standardized Concept information or use the CONCEPT table as a reference for mapping clinical data from source terminologies to Standard Concepts.",NA -vocabulary,VOCAB,No,NA,No,NA,NA,The VOCABULARY table includes a list of the Vocabularies integrated from various sources or created de novo in OMOP CDM. This reference table contains a single record for each Vocabulary and includes a descriptive name and other associated attributes for the Vocabulary.,"The primary purpose of the VOCABULARY table is to provide explicit information about specific vocabulary versions and the references to the sources from which they are asserted. Users can identify the version of a particular vocabulary used in the database, enabling consistency and reproducibility in data analysis. Besides, users can check the vocabulary release version in their CDM which refers to the vocabulary_id = 'None'.",NA -domain,VOCAB,No,NA,No,NA,NA,"The DOMAIN table includes a list of OMOP-defined Domains to which the Concepts of the Standardized Vocabularies can belong. A Domain represents a clinical definition whereby we assign matching Concepts for the standardized fields in the CDM tables. For example, the Condition Domain contains Concepts that describe a patient condition, and these Concepts can only be used in the condition_concept_id field of the CONDITION_OCCURRENCE and CONDITION_ERA tables. This reference table is populated with a single record for each Domain, including a Domain ID and a descriptive name for every Domain.","Users can leverage the DOMAIN table to explore the full spectrum of health-related data Domains available in the Standardized Vocabularies. Also, the information in the DOMAIN table may be used as a reference for mapping source data to OMOP domains, facilitating data harmonization and interoperability.",NA +Users can join the CONCEPT table with other tables in the CDM to enrich clinical data with standardized Concept information or use the CONCEPT table as a reference for mapping clinical data from source terminologies to Standard Concepts.",NA +vocabulary,VOCAB,No,NA,No,NA,NA,The VOCABULARY table includes a list of the Vocabularies integrated from various sources or created de novo in OMOP CDM. This reference table contains a single record for each Vocabulary and includes a descriptive name and other associated attributes for the Vocabulary.,"The primary purpose of the VOCABULARY table is to provide explicit information about specific vocabulary versions and the references to the sources from which they are asserted. Users can identify the version of a particular vocabulary used in the database, enabling consistency and reproducibility in data analysis. Besides, users can check the vocabulary release version in their CDM which refers to the vocabulary_id = 'None'.",NA +domain,VOCAB,No,NA,No,NA,NA,"The DOMAIN table includes a list of OMOP-defined Domains to which the Concepts of the Standardized Vocabularies can belong. A Domain represents a clinical definition whereby we assign matching Concepts for the standardized fields in the CDM tables. For example, the Condition Domain contains Concepts that describe a patient condition, and these Concepts can only be used in the condition_concept_id field of the CONDITION_OCCURRENCE and CONDITION_ERA tables. This reference table is populated with a single record for each Domain, including a Domain ID and a descriptive name for every Domain.","Users can leverage the DOMAIN table to explore the full spectrum of health-related data Domains available in the Standardized Vocabularies. Also, the information in the DOMAIN table may be used as a reference for mapping source data to OMOP domains, facilitating data harmonization and interoperability.",NA concept_class,VOCAB,No,NA,No,NA,NA,"The CONCEPT_CLASS table includes semantic categories that reference the source structure of each Vocabulary. Concept Classes represent so-called horizontal (e.g. MedDRA, RxNorm) or vertical levels (e.g. SNOMED) of the vocabulary structure. Vocabularies without any Concept Classes, such as HCPCS, use the vocabulary_id as the Concept Class. This reference table is populated with a single record for each Concept Class, which includes a Concept Class ID and a fully specified Concept Class name. -",Users can utilize the CONCEPT_CLASS table to explore the different classes or categories of concepts within the OHDSI vocabularies.,NA -concept_relationship,VOCAB,No,NA,No,NA,NA,"The CONCEPT_RELATIONSHIP table contains records that define relationships between any two Concepts and the nature or type of the relationship. This table captures various types of relationships, including hierarchical, associative, and other semantic connections, enabling comprehensive analysis and interpretation of clinical concepts. Every kind of relationship is defined in the RELATIONSHIP table.","The CONCEPT_RELATIONSHIP table can be used to explore hierarchical or attribute relationships between concepts to understand the hierarchical structure of clinical concepts and uncover implicit connections and associations within healthcare data. For example, users can utilize mapping relationships ('Maps to') to harmonize data from different sources and terminologies, enabling interoperability and data integration across disparate datasets.",NA -relationship,VOCAB,No,NA,No,NA,NA,The RELATIONSHIP table provides a reference list of all types of relationships that can be used to associate any two concepts in the CONCEPT_RELATIONSHP table.,NA,NA -concept_synonym,VOCAB,No,NA,No,NA,NA,The CONCEPT_SYNONYM table is used to store alternate names and descriptions for Concepts.,NA,NA +",Users can utilize the CONCEPT_CLASS table to explore the different classes or categories of concepts within the OHDSI vocabularies.,NA +concept_relationship,VOCAB,No,NA,No,NA,NA,"The CONCEPT_RELATIONSHIP table contains records that define relationships between any two Concepts and the nature or type of the relationship. This table captures various types of relationships, including hierarchical, associative, and other semantic connections, enabling comprehensive analysis and interpretation of clinical concepts. Every kind of relationship is defined in the RELATIONSHIP table.","The CONCEPT_RELATIONSHIP table can be used to explore hierarchical or attribute relationships between concepts to understand the hierarchical structure of clinical concepts and uncover implicit connections and associations within healthcare data. For example, users can utilize mapping relationships ('Maps to') to harmonize data from different sources and terminologies, enabling interoperability and data integration across disparate datasets.",NA +relationship,VOCAB,No,NA,No,NA,NA,The RELATIONSHIP table provides a reference list of all types of relationships that can be used to associate any two concepts in the CONCEPT_RELATIONSHP table.,NA,NA +concept_synonym,VOCAB,No,NA,No,NA,NA,The CONCEPT_SYNONYM table is used to store alternate names and descriptions for Concepts.,NA,NA concept_ancestor,VOCAB,No,NA,No,NA,NA,"The CONCEPT_ANCESTOR table is designed to simplify observational analysis by providing the complete hierarchical relationships between Concepts. Only direct parent-child relationships between Concepts are stored in the CONCEPT_RELATIONSHIP table. To determine higher level ancestry connections, all individual direct relationships would have to be navigated at analysis time. The CONCEPT_ANCESTOR table includes records for all parent-child relationships, as well as grandparent-grandchild relationships and those of any other level of lineage. Using the CONCEPT_ANCESTOR table allows for querying for all descendants of a hierarchical concept. For example, drug ingredients and drug products are all descendants of a drug class ancestor. -This table is entirely derived from the CONCEPT, CONCEPT_RELATIONSHIP and RELATIONSHIP tables.",NA,NA -source_to_concept_map,VOCAB,No,NA,No,NA,NA,"The source to concept map table is recommended for use in ETL processes to maintain local source codes which are not available as Concepts in the Standardized Vocabularies, and to establish mappings for each source code into a Standard Concept as target_concept_ids that can be used to populate the Common Data Model tables. The SOURCE_TO_CONCEPT_MAP table is no longer populated with content within the Standardized Vocabularies published to the OMOP community. **There are OHDSI tools to help you populate this table; [Usagi](https://github.com/OHDSI/Usagi) and [Perseus](https://github.com/ohdsi/Perseus). You can read more about OMOP vocabulary mapping in [The Book of OHDSI Chapter 6.3](https://ohdsi.github.io/TheBookOfOhdsi/ExtractTransformLoad.html#step-2-create-the-code-mappings).**",NA,NA -drug_strength,VOCAB,No,NA,No,NA,NA,The DRUG_STRENGTH table contains structured content about the amount or concentration and associated units of a specific ingredient contained within a particular drug product. This table is supplemental information to support standardized analysis of drug utilization.,NA,NA -cohort,RESULTS,No,NA,No,NA,NA,"The subject of a cohort can have multiple, discrete records in the cohort table per cohort_definition_id, subject_id, and non-overlapping time periods. The definition of the cohort is contained within the COHORT_DEFINITION table. It is listed as part of the RESULTS schema because it is a table that users of the database as well as tools such as ATLAS need to be able to write to. The CDM and Vocabulary tables are all read-only so it is suggested that the COHORT and COHORT_DEFINTION tables are kept in a separate schema to alleviate confusion.",NA,"Cohorts typically include patients diagnosed with a specific condition, patients exposed to a particular drug, but can also be Providers who have performed a specific Procedure. Cohort records must have a Start Date and an End Date, but the End Date may be set to Start Date or could have an applied censor date using the Observation Period Start Date. Cohort records must contain a Subject Id, which can refer to the Person, Provider, Visit record or Care Site though they are most often Person Ids. The Cohort Definition will define the type of subject through the subject concept id. A subject can belong (or not belong) to a cohort at any moment in time. A subject can only have one record in the cohort table for any moment of time, i.e. it is not possible for a person to contain multiple records indicating cohort membership that are overlapping in time" +This table is entirely derived from the CONCEPT, CONCEPT_RELATIONSHIP and RELATIONSHIP tables.",NA,NA +source_to_concept_map,VOCAB,No,NA,No,NA,NA,"The source to concept map table is recommended for use in ETL processes to maintain local source codes which are not available as Concepts in the Standardized Vocabularies, and to establish mappings for each source code into a Standard Concept as target_concept_ids that can be used to populate the Common Data Model tables. The SOURCE_TO_CONCEPT_MAP table is no longer populated with content within the Standardized Vocabularies published to the OMOP community. **There are OHDSI tools to help you populate this table; [Usagi](https://github.com/OHDSI/Usagi) and [Perseus](https://github.com/ohdsi/Perseus). You can read more about OMOP vocabulary mapping in [The Book of OHDSI Chapter 6.3](https://ohdsi.github.io/TheBookOfOhdsi/ExtractTransformLoad.html#step-2-create-the-code-mappings).**",NA,NA +drug_strength,VOCAB,No,NA,No,NA,NA,The DRUG_STRENGTH table contains structured content about the amount or concentration and associated units of a specific ingredient contained within a particular drug product. This table is supplemental information to support standardized analysis of drug utilization.,NA,NA +cohort,RESULTS,No,NA,No,NA,NA,"The subject of a cohort can have multiple, discrete records in the cohort table per cohort_definition_id, subject_id, and non-overlapping time periods. The definition of the cohort is contained within the COHORT_DEFINITION table. It is listed as part of the RESULTS schema because it is a table that users of the database as well as tools such as ATLAS need to be able to write to. The CDM and Vocabulary tables are all read-only so it is suggested that the COHORT and COHORT_DEFINTION tables are kept in a separate schema to alleviate confusion.",NA,"Cohorts typically include patients diagnosed with a specific condition, patients exposed to a particular drug, but can also be Providers who have performed a specific Procedure. Cohort records must have a Start Date and an End Date, but the End Date may be set to Start Date or could have an applied censor date using the Observation Period Start Date. Cohort records must contain a Subject Id, which can refer to the Person, Provider, Visit record or Care Site though they are most often Person Ids. The Cohort Definition will define the type of subject through the subject concept id. A subject can belong (or not belong) to a cohort at any moment in time. A subject can only have one record in the cohort table for any moment of time, i.e. it is not possible for a person to contain multiple records indicating cohort membership that are overlapping in time" cohort_definition,RESULTS,No,NA,No,NA,NA,"The COHORT_DEFINITION table contains records defining a Cohort derived from the data through the associated description and syntax and upon instantiation (execution of the algorithm) placed into the COHORT table. Cohorts are a set of subjects that satisfy a given combination of inclusion criteria for a duration of time. The COHORT_DEFINITION table provides a standardized structure for maintaining the rules governing the inclusion of a subject into a cohort, and can store operational programming code to instantiate the cohort within the OMOP Common Data Model.",NA,NA \ No newline at end of file From 080816f659fc6001c2210b53467cda5533a75737 Mon Sep 17 00:00:00 2001 From: Lawrence Adams Date: Wed, 2 Oct 2024 08:13:35 +0100 Subject: [PATCH 21/39] fix: deadlinks in 5.4 rendered docs --- docs/cdm54.html | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/cdm54.html b/docs/cdm54.html index e705e60..8ebfa1d 100644 --- a/docs/cdm54.html +++ b/docs/cdm54.html @@ -715,7 +715,7 @@ Person. This field should not be used to study gender identity issues. Use the gender or sex value present in the data under the assumption that it is the biological sex at birth. If the source data captures gender identity it should be stored in the OBSERVATION +href="https://ohdsi.github.io/CommonDataModel/cdm54.html#observation">OBSERVATION table. Accepted gender concepts. Please refer to the Put the location_id from the LOCATION +href="https://ohdsi.github.io/CommonDataModel/cdm54.html#location">LOCATION table here that represents the most granular location information for the person. For additional information on how to populate this field, please refer to the Put the provider_id from the PROVIDER +href="https://ohdsi.github.io/CommonDataModel/cdm54.html#provider">PROVIDER table of the last known general practitioner of the person. If there are multiple providers, it is up to the ETL to decide which to put here. @@ -1379,7 +1379,7 @@ insurance claim data, the Observation Period can be considered as the time period the Person is enrolled with a payer. If a Person switches plans but stays with the same payer, and therefore capturing of data continues, that change would be captured in PAYER_PLAN_PERIOD. +href="https://ohdsi.github.io/CommonDataModel/cdm54.html#payer_plan_period">PAYER_PLAN_PERIOD. date @@ -1879,7 +1879,7 @@ PROCEDURE_OCCURRENCE, etc.) or in the VISIT_DETAIL table. If there are multiple providers associated with a visit, you will need to choose which one to put here. The additional providers can be stored in the VISIT_DETAIL +href="https://ohdsi.github.io/CommonDataModel/cdm54.html#visit_detail">VISIT_DETAIL table. @@ -2858,21 +2858,21 @@ identifying Persons who should suffer from the recorded Condition. Record all conditions as they exist in the source data. Any decisions about diagnosis/phenotype definitions would be done through cohort specifications. These cohorts can be housed in the COHORT +href="https://ohdsi.github.io/CommonDataModel/cdm54.html#payer_plan_period">COHORT table. Conditions span a time interval from start to end, but are typically recorded as single snapshot records with no end date. The reason is twofold: (i) At the time of the recording the duration is not known and later not recorded, and (ii) the Persons typically cease interacting with the healthcare system when they feel better, which leads to incomplete capture of resolved Conditions. The CONDITION_ERA +href="https://ohdsi.github.io/CommonDataModel/cdm54.html#condition_era">CONDITION_ERA table addresses this issue. Family history and past diagnoses (‘history of’) are not recorded in this table. Instead, they are listed in the OBSERVATION +href="https://ohdsi.github.io/CommonDataModel/cdm54.html#observation">OBSERVATION table. Codes written in the process of establishing the diagnosis, such as ‘question of’ of and ‘rule out’, should not represented here. Instead, they should be recorded in the OBSERVATION +href="https://ohdsi.github.io/CommonDataModel/cdm54.html#observation">OBSERVATION table, if they are used for analyses. However, this information is not always available.

ETL Conventions

@@ -13178,7 +13178,7 @@ domain_id A foreign key to the DOMAIN +href="https://ohdsi.github.io/CommonDataModel/cdm54.html#domain">DOMAIN table the Concept belongs to. @@ -13207,7 +13207,7 @@ vocabulary_id A foreign key to the VOCABULARY +href="https://ohdsi.github.io/CommonDataModel/cdm54.html#vocabulary">VOCABULARY table indicating from which source the Concept has been adapted. @@ -14256,7 +14256,7 @@ relationship_concept_id A foreign key that refers to an identifier in the CONCEPT +href="https://ohdsi.github.io/CommonDataModel/cdm54.html#concept">CONCEPT table for the unique relationship concept. From 720b5480e9bb4a722a559078ee36f36d3dd7ec1e Mon Sep 17 00:00:00 2001 From: Lawrence Adams Date: Wed, 2 Oct 2024 08:14:53 +0100 Subject: [PATCH 22/39] fix: data model conventions dead links --- docs/dataModelConventions.html | 22 +++++++++++----------- rmd/dataModelConventions.Rmd | 20 ++++++++++---------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/docs/dataModelConventions.html b/docs/dataModelConventions.html index bd6b1cd..613d1c4 100644 --- a/docs/dataModelConventions.html +++ b/docs/dataModelConventions.html @@ -603,7 +603,7 @@ the same Concept between releases of the Standardized Vocabularies.
  • A descriptive name for each Concept is stored as the Concept Name as part of the CONCEPT table. Additional names and descriptions for the Concept are stored as Synonyms in the CONCEPT_SYNONYM +href="https://ohdsi.github.io/CommonDataModel/cdm54.html#concept_synonym">CONCEPT_SYNONYM table.
  • Each Concept is assigned to a Domain. For Standard Concepts, there is always a single Domain. Source Concepts can be composite or @@ -631,7 +631,7 @@ participate in the construction of the CONCEPT_ANCESTOR table and can be used to identify Descendants that may appear in the data. See CONCEPT_ANCESTOR table. Non-standard Concepts can only appear in *_source_concept_id fields and are not used in CONCEPT_ANCESTOR +href="https://ohdsi.github.io/CommonDataModel/cdm54.html#concept_ancestor">CONCEPT_ANCESTOR table. Please refer to the Standardized Vocabularies specifications for details of the Standard Concept designation.
  • The lifespan of a Concept is recorded through its valid_start_date, @@ -760,12 +760,12 @@ concept_id_1 and concept_id_2 fields.
  • Concept Relationships define direct relationships between Concepts. Indirect relationships through 3rd Concepts are not captured in this table. However, the CONCEPT_ANCESTOR +href="https://ohdsi.github.io/CommonDataModel/cdm54.html#concept_ancestor">CONCEPT_ANCESTOR table does this for hierarchical relationships over several “generations” of direct relationships.
  • In previous versions of the CDM, the relationship_id used to be a numerical identifier. See the RELATIONSHIP +href="https://ohdsi.github.io/CommonDataModel/cdm54.html#relationship">RELATIONSHIP table.
  • @@ -790,7 +790,7 @@ purposes of creating a closed Information Model, where all entities in the OMOP CDM are covered by unique Concepts.
  • Hierarchical Relationships are used to build a hierarchical tree out of the Concepts, which is recorded in the CONCEPT_ANCESTOR +href="https://ohdsi.github.io/CommonDataModel/cdm54.html#concept_ancestor">CONCEPT_ANCESTOR table. For example, “has_ingredient” is a Relationship between Concept of the Concept Class ‘Clinical Drug’ and those of ‘Ingredient’, and all Ingredients can be classified as the “parental” hierarchical Concepts @@ -806,16 +806,16 @@ same Vocabulary or those adopted from different Vocabulary sources.
  • The concept_synonym_name field contains a valid Synonym of a concept, including the description in the concept_name itself. I.e. each Concept has at least one Synonym in the CONCEPT_SYNONYM +href="https://ohdsi.github.io/CommonDataModel/cdm54.html#concept_synonym">CONCEPT_SYNONYM table. As an example, for a SNOMED-CT Concept, if the fully specified name is stored as the concept_name of the CONCEPT +href="https://ohdsi.github.io/CommonDataModel/cdm54.html#concept">CONCEPT table, then the Preferred Term and Synonyms associated with the Concept are stored in the CONCEPT_SYNONYM +href="https://ohdsi.github.io/CommonDataModel/cdm54.html#concept_synonym">CONCEPT_SYNONYM table.
  • Only Synonyms that are active and current are stored in the CONCEPT_SYNONYM +href="https://ohdsi.github.io/CommonDataModel/cdm54.html#concept_synonym">CONCEPT_SYNONYM table. Tracking synonym/description history and mapping of obsolete synonyms to current Concepts/Synonyms is out of scope for the Standard Vocabularies.
  • @@ -827,12 +827,12 @@ Vocabularies.
    • Each concept is also recorded as an ancestor of itself.
    • Only valid and Standard Concepts participate in the CONCEPT_ANCESTOR +href="https://ohdsi.github.io/CommonDataModel/cdm54.html#concept_ancestor">CONCEPT_ANCESTOR table. It is not possible to find ancestors or descendants of deprecated or Source Concepts.
    • Usually, only Concepts of the same Domain are connected through records of the CONCEPT_ANCESTOR +href="https://ohdsi.github.io/CommonDataModel/cdm54.html#concept_ancestor">CONCEPT_ANCESTOR table, but there might be exceptions.
    diff --git a/rmd/dataModelConventions.Rmd b/rmd/dataModelConventions.Rmd index 6bd2542..59d686b 100644 --- a/rmd/dataModelConventions.Rmd +++ b/rmd/dataModelConventions.Rmd @@ -42,7 +42,7 @@ corresponding Concept reference data. - The concept_id of a Concept is persistent, i.e. stays the same for the same Concept between releases of the Standardized Vocabularies. - A descriptive name for each Concept is stored as the Concept Name as part of the CONCEPT table. Additional -names and descriptions for the Concept are stored as Synonyms in the [CONCEPT_SYNONYM](https://ohdsi.github.io/CommonDataModel/cdm531.html#concept_synonym) +names and descriptions for the Concept are stored as Synonyms in the [CONCEPT_SYNONYM](https://ohdsi.github.io/CommonDataModel/cdm54.html#concept_synonym) table. - Each Concept is assigned to a Domain. For Standard Concepts, there is always a single Domain. Source Concepts can be composite or coordinated entities, and therefore can belong to more than one Domain. @@ -61,7 +61,7 @@ field and can be used to reference the source vocabulary. in all *_concept_id fields, whereas Classification Concepts (‘C’) should not appear in the CDM data, but participate in the construction of the CONCEPT_ANCESTOR table and can be used to identify Descendants that may appear in the data. See CONCEPT_ANCESTOR table. Non-standard -Concepts can only appear in *_source_concept_id fields and are not used in [CONCEPT_ANCESTOR](https://ohdsi.github.io/CommonDataModel/cdm531.html#concept_ancestor) +Concepts can only appear in *_source_concept_id fields and are not used in [CONCEPT_ANCESTOR](https://ohdsi.github.io/CommonDataModel/cdm54.html#concept_ancestor) table. Please refer to the Standardized Vocabularies specifications for details of the Standard Concept designation. - The lifespan of a Concept is recorded through its valid_start_date, valid_end_date and the invalid_ @@ -144,10 +144,10 @@ and the relationship_id replaced by the reverse_relationship_id from the RELATIO not necessary to query for the existence of a relationship both in the concept_id_1 and concept_id_2 fields. - Concept Relationships define direct relationships between Concepts. Indirect relationships through 3rd -Concepts are not captured in this table. However, the [CONCEPT_ANCESTOR](https://ohdsi.github.io/CommonDataModel/cdm531.html#concept_ancestor) table does this for +Concepts are not captured in this table. However, the [CONCEPT_ANCESTOR](https://ohdsi.github.io/CommonDataModel/cdm54.html#concept_ancestor) table does this for hierarchical relationships over several “generations” of direct relationships. - In previous versions of the CDM, the relationship_id used to be a numerical identifier. See the -[RELATIONSHIP](https://ohdsi.github.io/CommonDataModel/cdm531.html#relationship) table. +[RELATIONSHIP](https://ohdsi.github.io/CommonDataModel/cdm54.html#relationship) table. ### Relationship Table - There is one record for each Relationship. @@ -163,7 +163,7 @@ Relationship is provided in the reverse_relationship_id field. concept_id field. This is for purposes of creating a closed Information Model, where all entities in the OMOP CDM are covered by unique Concepts. - Hierarchical Relationships are used to build a hierarchical tree out of the Concepts, which is recorded in -the [CONCEPT_ANCESTOR](https://ohdsi.github.io/CommonDataModel/cdm531.html#concept_ancestor) table. For example, “has_ingredient” is a Relationship between Concept +the [CONCEPT_ANCESTOR](https://ohdsi.github.io/CommonDataModel/cdm54.html#concept_ancestor) table. For example, “has_ingredient” is a Relationship between Concept of the Concept Class ‘Clinical Drug’ and those of ‘Ingredient’, and all Ingredients can be classified as the “parental” hierarchical Concepts for the drug products they are part of. All ‘Is a’ Relationships are hierarchical. @@ -172,19 +172,19 @@ from different Vocabulary sources. ### Concept Synonyms - The concept_synonym_name field contains a valid Synonym of a concept, including the description in -the concept_name itself. I.e. each Concept has at least one Synonym in the [CONCEPT_SYNONYM](https://ohdsi.github.io/CommonDataModel/cdm531.html#concept_synonym) +the concept_name itself. I.e. each Concept has at least one Synonym in the [CONCEPT_SYNONYM](https://ohdsi.github.io/CommonDataModel/cdm54.html#concept_synonym) table. As an example, for a SNOMED-CT Concept, if the fully specified name is stored as the -concept_name of the [CONCEPT](https://ohdsi.github.io/CommonDataModel/cdm531.html#concept) table, then the Preferred Term and Synonyms associated with the Concept are stored in the [CONCEPT_SYNONYM](https://ohdsi.github.io/CommonDataModel/cdm531.html#concept_synonym) table. -- Only Synonyms that are active and current are stored in the [CONCEPT_SYNONYM](https://ohdsi.github.io/CommonDataModel/cdm531.html#concept_synonym) table. Tracking +concept_name of the [CONCEPT](https://ohdsi.github.io/CommonDataModel/cdm54.html#concept) table, then the Preferred Term and Synonyms associated with the Concept are stored in the [CONCEPT_SYNONYM](https://ohdsi.github.io/CommonDataModel/cdm54.html#concept_synonym) table. +- Only Synonyms that are active and current are stored in the [CONCEPT_SYNONYM](https://ohdsi.github.io/CommonDataModel/cdm54.html#concept_synonym) table. Tracking synonym/description history and mapping of obsolete synonyms to current Concepts/Synonyms is out of scope for the Standard Vocabularies. - Currently, only English Synonyms are included. ### Concept Ancestor - Each concept is also recorded as an ancestor of itself. -- Only valid and Standard Concepts participate in the [CONCEPT_ANCESTOR](https://ohdsi.github.io/CommonDataModel/cdm531.html#concept_ancestor) table. It is not possible +- Only valid and Standard Concepts participate in the [CONCEPT_ANCESTOR](https://ohdsi.github.io/CommonDataModel/cdm54.html#concept_ancestor) table. It is not possible to find ancestors or descendants of deprecated or Source Concepts. -- Usually, only Concepts of the same Domain are connected through records of the [CONCEPT_ANCESTOR](https://ohdsi.github.io/CommonDataModel/cdm531.html#concept_ancestor) table, but there might be exceptions. +- Usually, only Concepts of the same Domain are connected through records of the [CONCEPT_ANCESTOR](https://ohdsi.github.io/CommonDataModel/cdm54.html#concept_ancestor) table, but there might be exceptions. ### Source to Concept Map - This table is no longer used to distribute mapping information between source codes and Standard From 561c93dc650b85dd340842ec22b3d8498ad9215b Mon Sep 17 00:00:00 2001 From: Clair Blacketer Date: Tue, 7 Jan 2025 12:38:59 -0500 Subject: [PATCH 23/39] Revert "docs update" This reverts commit 330c0873408fed46c488e4910c2d1c0f393a6f08. --- docs/cdm54.html | 3 +-- docs/images/Santa-George-A.png | Bin 111579 -> 0 bytes rmd/cdm54.Rmd | 3 +-- rmd/images/Santa-George-A.png | Bin 111579 -> 0 bytes 4 files changed, 2 insertions(+), 4 deletions(-) delete mode 100644 docs/images/Santa-George-A.png delete mode 100644 rmd/images/Santa-George-A.png diff --git a/docs/cdm54.html b/docs/cdm54.html index e29ef31..e705e60 100644 --- a/docs/cdm54.html +++ b/docs/cdm54.html @@ -13,7 +13,7 @@ OMOP CDM v5.4 - + @@ -495,7 +495,6 @@ div.tocify { -

    This is the specification document for the OMOP Common Data Model, v5.4. This is the latest version of the OMOP CDM. Each table is represented with a high-level description and ETL conventions diff --git a/docs/images/Santa-George-A.png b/docs/images/Santa-George-A.png deleted file mode 100644 index 9d26c69f88c21fa63d4d75732d542b78f4bafa1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111579 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%0Ar5GOT;zTG8D$%ZSdL26|PDx|{+tmZ(E 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%0Ar5GOT;zTG8D$%ZSdL26|PDx|{+tmZ(E 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 Date: Thu, 20 Feb 2025 21:11:38 +0100 Subject: [PATCH 24/39] fix typo --- inst/csv/OMOP_CDMv5.3_Field_Level.csv | 2 +- inst/csv/OMOP_CDMv5.4_Field_Level.csv | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/inst/csv/OMOP_CDMv5.3_Field_Level.csv b/inst/csv/OMOP_CDMv5.3_Field_Level.csv index 3f52888..dfbb68b 100644 --- a/inst/csv/OMOP_CDMv5.3_Field_Level.csv +++ b/inst/csv/OMOP_CDMv5.3_Field_Level.csv @@ -12,7 +12,7 @@ person,provider_id,No,integer,The Provider refers to the last known primary care person,care_site_id,No,integer,The Care Site refers to where the Provider typically provides the primary care.,NA,No,Yes,CARE_SITE,CARE_SITE_ID,NA,NA,NA person,person_source_value,No,varchar(50),Use this field to link back to persons in the source data. This is typically used for error checking of ETL logic.,Some use cases require the ability to link back to persons in the source data. This field allows for the storing of the person value as it appears in the source. This field is not required but strongly recommended.,No,No,NA,NA,NA,NA,NA person,gender_source_value,No,varchar(50),This field is used to store the biological sex of the person from the source data. It is not intended for use in standard analytics but for reference only.,Put the assigned sex at birth of the person as it appears in the source data.,No,No,NA,NA,NA,NA,NA -person,gender_source_concept_id,No,integer,"Due to the small number of options, this tends to be zero.","If the source data codes asigned sex at birth in a non-standard vocabulary, store the concept_id here.",No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA +person,gender_source_concept_id,No,integer,"Due to the small number of options, this tends to be zero.","If the source data codes assigned sex at birth in a non-standard vocabulary, store the concept_id here.",No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA person,race_source_value,No,varchar(50),This field is used to store the race of the person from the source data. It is not intended for use in standard analytics but for reference only.,Put the race of the person as it appears in the source data.,No,No,NA,NA,NA,NA,NA person,race_source_concept_id,No,integer,"Due to the small number of options, this tends to be zero.",If the source data codes race in an OMOP supported vocabulary store the concept_id here.,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA person,ethnicity_source_value,No,varchar(50),This field is used to store the ethnicity of the person from the source data. It is not intended for use in standard analytics but for reference only.,"If the person has an ethnicity other than the OMB standard of ""Hispanic"" or ""Not Hispanic"" store that value from the source data here.",No,No,NA,NA,NA,NA,NA diff --git a/inst/csv/OMOP_CDMv5.4_Field_Level.csv b/inst/csv/OMOP_CDMv5.4_Field_Level.csv index 7817bb9..0e7f9fa 100644 --- a/inst/csv/OMOP_CDMv5.4_Field_Level.csv +++ b/inst/csv/OMOP_CDMv5.4_Field_Level.csv @@ -12,7 +12,7 @@ person,provider_id,No,integer,The Provider refers to the last known primary care person,care_site_id,No,integer,The Care Site refers to where the Provider typically provides the primary care.,NA,No,Yes,CARE_SITE,CARE_SITE_ID,NA,NA,NA person,person_source_value,No,varchar(50),Use this field to link back to persons in the source data. This is typically used for error checking of ETL logic.,Some use cases require the ability to link back to persons in the source data. This field allows for the storing of the person value as it appears in the source. This field is not required but strongly recommended.,No,No,NA,NA,NA,NA,NA person,gender_source_value,No,varchar(50),This field is used to store the biological sex of the person from the source data. It is not intended for use in standard analytics but for reference only.,Put the assigned sex at birth of the person as it appears in the source data.,No,No,NA,NA,NA,NA,NA -person,gender_source_concept_id,No,integer,"Due to the small number of options, this tends to be zero.","If the source data codes asigned sex at birth in a non-standard vocabulary, store the concept_id here.",No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA +person,gender_source_concept_id,No,integer,"Due to the small number of options, this tends to be zero.","If the source data codes assigned sex at birth in a non-standard vocabulary, store the concept_id here.",No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA person,race_source_value,No,varchar(50),This field is used to store the race of the person from the source data. It is not intended for use in standard analytics but for reference only.,Put the race of the person as it appears in the source data.,No,No,NA,NA,NA,NA,NA person,race_source_concept_id,No,integer,"Due to the small number of options, this tends to be zero.",If the source data codes race in an OMOP supported vocabulary store the concept_id here.,No,Yes,CONCEPT,CONCEPT_ID,NA,NA,NA person,ethnicity_source_value,No,varchar(50),This field is used to store the ethnicity of the person from the source data. It is not intended for use in standard analytics but for reference only.,"If the person has an ethnicity other than the OMB standard of ""Hispanic"" or ""Not Hispanic"" store that value from the source data here.",No,No,NA,NA,NA,NA,NA From bbc3fb9f74e4eb127114e3b3304cf26374b0a4ce Mon Sep 17 00:00:00 2001 From: Maxim Moinat Date: Fri, 21 Feb 2025 08:30:41 +0100 Subject: [PATCH 25/39] remove reference to value_as_datetime --- docs/cdm53.html | 12884 +--------------------- docs/cdm54.html | 14058 +----------------------- inst/csv/OMOP_CDMv5.3_Table_Level.csv | 74 +- inst/csv/OMOP_CDMv5.4_Table_Level.csv | 78 +- 4 files changed, 96 insertions(+), 26998 deletions(-) diff --git a/docs/cdm53.html b/docs/cdm53.html index 1172650..b27c048 100644 --- a/docs/cdm53.html +++ b/docs/cdm53.html @@ -13,7 +13,7 @@ OMOP CDM v5.3 - + @@ -35,8 +35,8 @@ - - + +