From f278bbac12a0823b7757675a767b5145b83a7377 Mon Sep 17 00:00:00 2001 From: Michael Terry Date: Tue, 23 Apr 2024 15:44:43 -0400 Subject: [PATCH] feat: support input database without patient extensions Features: - The core__patient no longer requires the presence of race/ethnicity extensions to build (it now uses the deep-schema checking code) Bug Fixes: - If there are both detailed and ombCategory values for an extension, no longer report both - just prefer the ombCategory version. --- .../studies/core/builder_patient.py | 57 +++++- .../core/reference_sql/builder_condition.sql | 5 +- .../builder_documentreference.sql | 1 - .../core/reference_sql/builder_encounter.sql | 17 +- .../builder_medicationrequest.sql | 1 - .../reference_sql/builder_observation.sql | 20 +- .../core/reference_sql/builder_patient.sql | 54 +---- .../extension_denormalize.sql.jinja | 2 +- cumulus_library/template_sql/sql_utils.py | 11 +- docs/first-time-setup.md | 17 +- tests/core/test_core.py | 20 -- tests/core/test_core_patient.py | 170 ++++++++++++++++ .../core__count_medicationrequest_month.csv | 188 +++++++++--------- ...ore__count_medicationrequest_month.parquet | Bin 22354 -> 22863 bytes tests/test_templates.py | 2 +- tests/testbed_utils.py | 17 -- 16 files changed, 354 insertions(+), 228 deletions(-) create mode 100644 tests/core/test_core_patient.py diff --git a/cumulus_library/studies/core/builder_patient.py b/cumulus_library/studies/core/builder_patient.py index 253515df..9e5bfb82 100644 --- a/cumulus_library/studies/core/builder_patient.py +++ b/cumulus_library/studies/core/builder_patient.py @@ -18,9 +18,49 @@ class PatientBuilder(BaseTableBuilder): display_text = "Creating Patient tables..." + @staticmethod + def make_extension_query( + schema: str, + cursor: databases.DatabaseCursor, + parser: databases.DatabaseParser, + name: str, + url: str, + ) -> str: + has_extensions = sql_utils.is_field_present( + schema=schema, + cursor=cursor, + parser=parser, + source_table="patient", + source_col="extension", + expected={ + "extension": { + "url": {}, + "valueCoding": sql_utils.CODING, + }, + "url": {}, + }, + ) + if has_extensions: + config = sql_utils.ExtensionConfig( + source_table="patient", + source_id="id", + target_table=f"core__patient_ext_{name}", + target_col_prefix=name, + fhir_extension=url, + ext_systems=["ombCategory", "detailed"], + is_array=True, + ) + return base_templates.get_extension_denormalize_query(config) + else: + return base_templates.get_ctas_empty_query( + schema_name=schema, + table_name=f"core__patient_ext_{name}", + table_cols=["id", "system", f"{name}_code", f"{name}_display"], + ) + def prepare_queries( self, - cursor: object, + cursor: databases.DatabaseCursor, schema: str, *args, parser: databases.DatabaseParser = None, @@ -41,18 +81,13 @@ def prepare_queries( "fhirpath": "http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity", }, ] - for extension in extension_types: - config = sql_utils.ExtensionConfig( - source_table="patient", - source_id="id", - target_table=f"core__patient_ext_{extension['name']}", - target_col_prefix=extension["name"], - fhir_extension=extension["fhirpath"], - ext_systems=["ombCategory", "detailed", "text"], - is_array=True, + self.queries.append( + self.make_extension_query( + schema, cursor, parser, extension["name"], extension["fhirpath"] + ) ) - self.queries.append(base_templates.get_extension_denormalize_query(config)) + validated_schema = sql_utils.validate_schema( cursor, schema, expected_table_cols, parser ) diff --git a/cumulus_library/studies/core/reference_sql/builder_condition.sql b/cumulus_library/studies/core/reference_sql/builder_condition.sql index fcb6b80f..e0c2740e 100644 --- a/cumulus_library/studies/core/reference_sql/builder_condition.sql +++ b/cumulus_library/studies/core/reference_sql/builder_condition.sql @@ -419,7 +419,6 @@ CREATE TABLE core__condition AS WITH temp_condition AS ( SELECT c.id, - c.category, c.subject.reference AS subject_ref, c.encounter.reference AS encounter_ref, cca.code, @@ -431,9 +430,7 @@ WITH temp_condition AS ( date_trunc('month', date(from_iso8601_timestamp(c."recordedDate"))) AS recordedDate_month, date_trunc('year', date(from_iso8601_timestamp(c."recordedDate"))) - AS recordedDate_year, - c.verificationStatus, - c.clinicalStatus + AS recordedDate_year FROM condition AS c LEFT JOIN core__condition_codable_concepts_all AS cca ON c.id = cca.id ) diff --git a/cumulus_library/studies/core/reference_sql/builder_documentreference.sql b/cumulus_library/studies/core/reference_sql/builder_documentreference.sql index afeb8ca8..e8fdb4b5 100644 --- a/cumulus_library/studies/core/reference_sql/builder_documentreference.sql +++ b/cumulus_library/studies/core/reference_sql/builder_documentreference.sql @@ -153,7 +153,6 @@ CREATE TABLE core__documentreference AS WITH temp_documentreference AS ( SELECT DISTINCT dr.id, - dr.type, dr.status, dr.docStatus, dr.context, diff --git a/cumulus_library/studies/core/reference_sql/builder_encounter.sql b/cumulus_library/studies/core/reference_sql/builder_encounter.sql index 8ae6ba58..0c6180b0 100644 --- a/cumulus_library/studies/core/reference_sql/builder_encounter.sql +++ b/cumulus_library/studies/core/reference_sql/builder_encounter.sql @@ -273,9 +273,9 @@ CREATE TABLE IF NOT EXISTS "main"."core__encounter_dn_servicetype" AS ( SELECT * FROM ( VALUES - (cast(NULL AS varchar),cast(NULL AS varchar),cast(NULL AS varchar),cast(NULL AS varchar)) + (cast(NULL AS varchar),cast(NULL AS bigint),cast(NULL AS varchar),cast(NULL AS varchar),cast(NULL AS varchar)) ) - AS t ("id","code","code_system","display") + AS t ("id","row","code","code_system","display") WHERE 1 = 0 -- ensure empty table ); @@ -285,9 +285,9 @@ CREATE TABLE IF NOT EXISTS "main"."core__encounter_dn_priority" AS ( SELECT * FROM ( VALUES - (cast(NULL AS varchar),cast(NULL AS varchar),cast(NULL AS varchar),cast(NULL AS varchar)) + (cast(NULL AS varchar),cast(NULL AS bigint),cast(NULL AS varchar),cast(NULL AS varchar),cast(NULL AS varchar)) ) - AS t ("id","code","code_system","display") + AS t ("id","row","code","code_system","display") WHERE 1 = 0 -- ensure empty table ); @@ -571,9 +571,9 @@ temp_encounter_nullable AS ( SELECT DISTINCT e.id, e.status, - e.class, + e.class.code AS class_code, + e.class.system AS class_code_system, e.subject.reference AS subject_ref, - e.period, date(from_iso8601_timestamp(e.period.start)) AS period_start, date_trunc('day', date(from_iso8601_timestamp(e."period"."end"))) AS period_end_day, @@ -598,7 +598,8 @@ temp_encounter AS ( SELECT DISTINCT e.id, e.status, - e.class, + e.class_code, + e.class_code_system, e.subject_ref, e.period_start, e.period_start_day, @@ -664,7 +665,7 @@ SELECT DISTINCT concat('Encounter/', e.id) AS encounter_ref FROM temp_encounter AS e LEFT JOIN core__fhir_mapping_expected_act_encounter_code_v3 AS eac - ON e.class.code = eac.found + ON e.class_code = eac.found LEFT JOIN core__fhir_act_encounter_code_v3 AS ac ON eac.expected = ac.code INNER JOIN core__patient AS p ON e.subject_ref = p.subject_ref WHERE diff --git a/cumulus_library/studies/core/reference_sql/builder_medicationrequest.sql b/cumulus_library/studies/core/reference_sql/builder_medicationrequest.sql index 52ee94bc..3b2b0213 100644 --- a/cumulus_library/studies/core/reference_sql/builder_medicationrequest.sql +++ b/cumulus_library/studies/core/reference_sql/builder_medicationrequest.sql @@ -100,7 +100,6 @@ WITH temp_mr AS ( date(from_iso8601_timestamp(mr.authoredOn)) AS authoredOn, date_trunc('month', date(from_iso8601_timestamp(mr."authoredOn"))) AS authoredOn_month, - cast(NULL as varchar) AS display, mr.reportedBoolean, mr.dosageInstruction, mr.subject.reference AS subject_ref, diff --git a/cumulus_library/studies/core/reference_sql/builder_observation.sql b/cumulus_library/studies/core/reference_sql/builder_observation.sql index d9f7a226..0a24dd33 100644 --- a/cumulus_library/studies/core/reference_sql/builder_observation.sql +++ b/cumulus_library/studies/core/reference_sql/builder_observation.sql @@ -244,9 +244,9 @@ CREATE TABLE IF NOT EXISTS "main"."core__observation_component_valuecodeableconc AS ( SELECT * FROM ( VALUES - (cast(NULL AS varchar),cast(NULL AS varchar),cast(NULL AS varchar),cast(NULL AS varchar)) + (cast(NULL AS varchar),cast(NULL AS bigint),cast(NULL AS varchar),cast(NULL AS varchar),cast(NULL AS varchar)) ) - AS t ("id","code","code_system","display") + AS t ("id","row","code","code_system","display") WHERE 1 = 0 -- ensure empty table ); @@ -256,9 +256,9 @@ CREATE TABLE IF NOT EXISTS "main"."core__observation_dn_interpretation" AS ( SELECT * FROM ( VALUES - (cast(NULL AS varchar),cast(NULL AS varchar),cast(NULL AS varchar),cast(NULL AS varchar)) + (cast(NULL AS varchar),cast(NULL AS bigint),cast(NULL AS varchar),cast(NULL AS varchar),cast(NULL AS varchar)) ) - AS t ("id","code","code_system","display") + AS t ("id","row","code","code_system","display") WHERE 1 = 0 -- ensure empty table ); @@ -304,9 +304,9 @@ CREATE TABLE IF NOT EXISTS "main"."core__observation_dn_dataabsentreason" AS ( SELECT * FROM ( VALUES - (cast(NULL AS varchar),cast(NULL AS varchar),cast(NULL AS varchar),cast(NULL AS varchar)) + (cast(NULL AS varchar),cast(NULL AS bigint),cast(NULL AS varchar),cast(NULL AS varchar),cast(NULL AS varchar)) ) - AS t ("id","code","code_system","display") + AS t ("id","row","code","code_system","display") WHERE 1 = 0 -- ensure empty table ); @@ -319,6 +319,8 @@ WITH temp_observation AS ( SELECT o.id, o.status, + o.encounter.reference AS encounter_ref, + o.subject.reference AS subject_ref, o.valueString, o.valueQuantity.value AS valueQuantity_value, o.valueQuantity.comparator AS valueQuantity_comparator, @@ -345,9 +347,7 @@ WITH temp_observation AS ( odvcc.display AS valueCodeableConcept_display, odda.code AS dataAbsentReason_code, odda.code_system AS dataAbsentReason_code_system, - odda.display AS dataAbsentReason_display, - o.subject.reference AS subject_ref, - o.encounter.reference AS encounter_ref + odda.display AS dataAbsentReason_display FROM observation AS o LEFT JOIN core__observation_dn_category AS odcat ON o.id = odcat.id LEFT JOIN core__observation_dn_code AS odc ON o.id = odc.id @@ -375,7 +375,7 @@ SELECT valueCodeableConcept_display, valueQuantity_value, valueQuantity_comparator, - valueQuantity_unit,valueQuantity_code_system AS valueQuantity_system, -- old alias + valueQuantity_unit, valueQuantity_code_system, valueQuantity_code, valueString, diff --git a/cumulus_library/studies/core/reference_sql/builder_patient.sql b/cumulus_library/studies/core/reference_sql/builder_patient.sql index 968144e2..4e8bcbc8 100644 --- a/cumulus_library/studies/core/reference_sql/builder_patient.sql +++ b/cumulus_library/studies/core/reference_sql/builder_patient.sql @@ -43,23 +43,6 @@ CREATE TABLE core__patient_ext_race AS ( AND ext_child.ext.valuecoding.display != '' ), - system_text AS ( - SELECT DISTINCT - s.id AS id, - '2' AS priority, - 'text' AS system, -- noqa: RF04 - ext_child.ext.valuecoding.code AS race_code, - ext_child.ext.valuecoding.display AS race_display - FROM - patient AS s, - UNNEST(s.extension) AS ext_parent (ext), - UNNEST(ext_parent.ext.extension) AS ext_child (ext) - WHERE - ext_parent.ext.url = 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-race' - AND ext_child.ext.url = 'text' - AND ext_child.ext.valuecoding.display != '' - ), - union_table AS ( SELECT id, @@ -76,14 +59,6 @@ CREATE TABLE core__patient_ext_race AS ( race_code, race_display FROM system_detailed - UNION - SELECT - id, - priority, - system, - race_code, - race_display - FROM system_text ORDER BY id, priority ) @@ -118,7 +93,7 @@ CREATE TABLE core__patient_ext_race AS ( ) AS race_display, ROW_NUMBER() OVER ( - PARTITION BY id, system + PARTITION BY id ORDER BY priority ASC ) AS available_priority FROM union_table @@ -166,23 +141,6 @@ CREATE TABLE core__patient_ext_ethnicity AS ( AND ext_child.ext.valuecoding.display != '' ), - system_text AS ( - SELECT DISTINCT - s.id AS id, - '2' AS priority, - 'text' AS system, -- noqa: RF04 - ext_child.ext.valuecoding.code AS ethnicity_code, - ext_child.ext.valuecoding.display AS ethnicity_display - FROM - patient AS s, - UNNEST(s.extension) AS ext_parent (ext), - UNNEST(ext_parent.ext.extension) AS ext_child (ext) - WHERE - ext_parent.ext.url = 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity' - AND ext_child.ext.url = 'text' - AND ext_child.ext.valuecoding.display != '' - ), - union_table AS ( SELECT id, @@ -199,14 +157,6 @@ CREATE TABLE core__patient_ext_ethnicity AS ( ethnicity_code, ethnicity_display FROM system_detailed - UNION - SELECT - id, - priority, - system, - ethnicity_code, - ethnicity_display - FROM system_text ORDER BY id, priority ) @@ -241,7 +191,7 @@ CREATE TABLE core__patient_ext_ethnicity AS ( ) AS ethnicity_display, ROW_NUMBER() OVER ( - PARTITION BY id, system + PARTITION BY id ORDER BY priority ASC ) AS available_priority FROM union_table diff --git a/cumulus_library/template_sql/extension_denormalize.sql.jinja b/cumulus_library/template_sql/extension_denormalize.sql.jinja index 6ed53ec6..f664fd16 100644 --- a/cumulus_library/template_sql/extension_denormalize.sql.jinja +++ b/cumulus_library/template_sql/extension_denormalize.sql.jinja @@ -72,7 +72,7 @@ CREATE TABLE {{ target_table }} AS ( {%- endif %} ROW_NUMBER() OVER ( - PARTITION BY id, system + PARTITION BY id ORDER BY priority ASC ) AS available_priority FROM union_table diff --git a/cumulus_library/template_sql/sql_utils.py b/cumulus_library/template_sql/sql_utils.py index 7493f8a1..5902d07a 100644 --- a/cumulus_library/template_sql/sql_utils.py +++ b/cumulus_library/template_sql/sql_utils.py @@ -203,10 +203,13 @@ def is_field_populated( parser: databases.DatabaseParser, source_table: str, hierarchy: list[tuple], - expected: list | None = None, + expected: list | dict | None = None, ) -> bool: """Traverses a complex field and determines if it exists and has data + Non-core studies that rely on the core tables shouldn't need this method. + This is just to examine the weird and wonderful world of the raw FHIR tables. + :keyword schema: The schema/database name :keyword cursor: a PEP-249 compliant database cursor :keyword source_table: The table to query against @@ -217,7 +220,7 @@ def is_field_populated( If none, we assume it is a CodeableConcept. :returns: a boolean indicating if valid data is present. """ - if not _check_schema_if_exists( + if not is_field_present( schema=schema, cursor=cursor, parser=parser, @@ -256,14 +259,14 @@ def is_field_populated( return True -def _check_schema_if_exists( +def is_field_present( *, schema: str, cursor: databases.DatabaseCursor, parser: databases.DatabaseParser, source_table: str, source_col: str, - expected: str | None = None, + expected: list | dict | None = None, ) -> bool: """Validation check for a column existing, and having the expected schema diff --git a/docs/first-time-setup.md b/docs/first-time-setup.md index c6c0f311..ae893bcb 100644 --- a/docs/first-time-setup.md +++ b/docs/first-time-setup.md @@ -8,15 +8,20 @@ nav_order: 1 # First Time Setup -## Installation +## Prerequisites + +1. Python 3.10 or later. +2. Access to an AWS cloud services account. +See the [AWS setup guide](./aws-setup.md) for more information on this. +3. An Athena database populated by +[Cumulus ETL](https://docs.smarthealthit.org/cumulus/etl/) +version 1.0 or later -As a prerequisite, you'll need a copy of python 3.10 or later installed on -your system, and you'll need access to an AWS cloud services account. +## Installation -You can install directly from pypi by running `pip install cumulus-library`. +You can install directly from pypi by running: -You will also need to make sure your machine is configured correctly to talk to AWS -services. See the [AWS setup guide](./aws-setup.md) for more information on this. +`pip install cumulus-library` ## Command line usage diff --git a/tests/core/test_core.py b/tests/core/test_core.py index dc9035c3..8a2beeae 100644 --- a/tests/core/test_core.py +++ b/tests/core/test_core.py @@ -169,9 +169,6 @@ def test_core_medication_query(medication_datasources, contains, omits): assert item not in query -# Patient schemas aren't fully pre-examined yet (we currently assume extensions exist). -# So we expect this to fail at the moment. -@pytest.mark.xfail def test_core_empty_database(tmp_path): """Verify that we can still generate core tables with no data filled in""" testbed = testbed_utils.LocalTestbed(tmp_path, with_patient=False) @@ -193,23 +190,6 @@ def test_core_tiny_database(tmp_path): assert {e[0] for e in encounters} == {"EncA"} -def test_core_multiple_patient_addresses(tmp_path): - """Verify that a patient with multiple addresses resolves to a single entry""" - testbed = testbed_utils.LocalTestbed(tmp_path, with_patient=False) - testbed.add_patient("None") - testbed.add_patient( - "Multi", - address=[ - {"city": "Boston"}, # null postal code - should not be picked up - {"postalCode": "12345"}, - {"postalCode": "00000"}, - ], - ) - con = testbed.build() - patients = con.sql("SELECT id, postalCode_3 FROM core__patient").fetchall() - assert {("None", "cumulus__none"), ("Multi", "123")} == set(patients) - - def test_core_multiple_doc_encounters(tmp_path): """Verify that a DocRef with multiple encounters resolves to multiple entries""" testbed = testbed_utils.LocalTestbed(tmp_path) diff --git a/tests/core/test_core_patient.py b/tests/core/test_core_patient.py new file mode 100644 index 00000000..31bc15e5 --- /dev/null +++ b/tests/core/test_core_patient.py @@ -0,0 +1,170 @@ +"""Tests for core__patient""" + +import pytest + +from tests import testbed_utils + + +@pytest.mark.parametrize( + "addresses,expected", + [ + (None, "cumulus__none"), # no address + ([{"city": "Boston"}], "cumulus__none"), # partial, but useless address + ( # multiple addresses + [ + {"city": "Boston"}, # null postal code - should not be picked up + {"postalCode": "12345"}, + {"postalCode": "00000"}, + ], + "123", + ), + ], +) +def test_core_patient_addresses(tmp_path, addresses, expected): + """Verify that addresses are parsed out""" + testbed = testbed_utils.LocalTestbed(tmp_path, with_patient=False) + testbed.add_patient("A", address=addresses) + con = testbed.build() + codes = con.sql("SELECT postalCode_3 FROM core__patient").fetchall() + assert [(expected,)] == codes + + +@pytest.mark.parametrize( + "extensions,expected_ethnicity,expected_race", + [ + (None, "unknown", "unknown"), # no extension + ( # basic ombCategory + [ + { + "url": "http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity", + "extension": [ + { + "url": "detailed", # ignored in favor of ombCategory + "valueCoding": {"display": "EthDetailed"}, + }, + { + "url": "ombCategory", + "valueCoding": {"display": "EthA"}, + }, + ], + }, + { + "url": "http://hl7.org/fhir/us/core/StructureDefinition/us-core-race", + "extension": [ + { + "url": "ombCategory", + "valueCoding": {"display": "RaceA"}, + }, + { + "url": "detailed", # ignored in favor of ombCategory + "valueCoding": {"display": "RaceDetailed"}, + }, + ], + }, + ], + "etha", + "racea", + ), + ( # will use detailed if we must + [ + { + "url": "http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity", + "extension": [ + { + "url": "detailed", + "valueCoding": {"display": "EthDetailed"}, + } + ], + }, + { + "url": "http://hl7.org/fhir/us/core/StructureDefinition/us-core-race", + "extension": [ + { + "url": "detailed", + "valueCoding": {"display": "RaceDetailed"}, + } + ], + }, + ], + "ethdetailed", + "racedetailed", + ), + ( # will ignore entries without a display + [ + { + "url": "http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity", + "extension": [ + { + "url": "ombCategory", + "valueCoding": { + "display": "" # empty string (instead of null) + }, + }, + { + "url": "ombCategory", + "valueCoding": {"display": "EthB"}, + }, + ], + }, + { + "url": "http://hl7.org/fhir/us/core/StructureDefinition/us-core-race", + "extension": [ + { + "url": "ombCategory", + "valueCoding": {"code": "just-a-code"}, + }, + { + "url": "detailed", + "valueCoding": {"display": "RaceDetailed"}, + }, + ], + }, + ], + "ethb", + "racedetailed", + ), + ( # multiples get joined + [ + { + "url": "http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity", + "extension": [ + { + "url": "detailed", + "valueCoding": {"display": "EthB"}, + }, + { + "url": "detailed", + "valueCoding": {"display": "EthA"}, + }, + ], + }, + { + "url": "http://hl7.org/fhir/us/core/StructureDefinition/us-core-race", + "extension": [ + { + "url": "ombCategory", + "valueCoding": {"display": "RaceA"}, + }, + { + "url": "ombCategory", + "valueCoding": {"display": "RaceB"}, + }, + ], + }, + ], + "etha; ethb", + "racea; raceb", + ), + ], +) +def test_core_patient_extensions( + tmp_path, extensions, expected_ethnicity, expected_race +): + """Verify that we grab race & ethnicity correctly""" + testbed = testbed_utils.LocalTestbed(tmp_path, with_patient=False) + testbed.add_patient("A", extension=extensions) + con = testbed.build() + displays = con.sql( + "SELECT ethnicity_display, race_display FROM core__patient" + ).fetchall() + assert [(expected_ethnicity, expected_race)] == displays diff --git a/tests/regression/reference/core__count_medicationrequest_month.csv b/tests/regression/reference/core__count_medicationrequest_month.csv index f834bb44..193bca43 100644 --- a/tests/regression/reference/core__count_medicationrequest_month.csv +++ b/tests/regression/reference/core__count_medicationrequest_month.csv @@ -1,8 +1,8 @@ cnt,status,intent,authoredon_month,medication_display -930,,,, -930,,order,, -896,stopped,,, -896,stopped,order,, +931,,,, +931,,order,, +898,stopped,,, +898,stopped,order,, 665,active,,, 665,active,order,, 242,,,,lisinopril 10 MG Oral Tablet @@ -35,10 +35,10 @@ cnt,status,intent,authoredon_month,medication_display 146,,order,,Ibuprofen 200 MG Oral Tablet 146,stopped,,,Ibuprofen 200 MG Oral Tablet 146,stopped,order,,Ibuprofen 200 MG Oral Tablet -141,,,2014-02-01, -141,,order,2014-02-01, -140,stopped,,2014-02-01, -140,stopped,order,2014-02-01, +142,,,2014-02-01, +142,,order,2014-02-01, +141,stopped,,2014-02-01, +141,stopped,order,2014-02-01, 119,,,,Acetaminophen 160 MG Chewable Tablet 119,,order,,Acetaminophen 160 MG Chewable Tablet 118,stopped,,,Acetaminophen 160 MG Chewable Tablet @@ -71,14 +71,14 @@ cnt,status,intent,authoredon_month,medication_display 97,,order,2021-03-01, 96,,,2019-03-01, 96,,order,2019-03-01, +96,stopped,,2021-03-01, 96,stopped,,2014-05-01, +96,stopped,order,2021-03-01, 96,stopped,order,2014-05-01, 95,stopped,,2019-03-01, 95,stopped,order,2019-03-01, 94,,,,Amoxicillin 500 MG Oral Tablet 94,,order,,Amoxicillin 500 MG Oral Tablet -94,stopped,,2021-03-01, -94,stopped,order,2021-03-01, 93,,,2014-04-01, 93,,order,2014-04-01, 92,,,2017-03-01, @@ -92,13 +92,13 @@ cnt,status,intent,authoredon_month,medication_display 88,,,2014-03-01, 88,,order,2014-03-01, 87,,,2022-03-01, +87,,,2014-01-01, 87,,order,2022-03-01, +87,,order,2014-01-01, 86,,,2022-04-01, -86,,,2014-01-01, 86,,order,2022-04-01, -86,,order,2014-01-01, -85,stopped,,2014-01-01, -85,stopped,order,2014-01-01, +86,stopped,,2014-01-01, +86,stopped,order,2014-01-01, 84,,,2021-09-01, 84,,order,2021-09-01, 84,stopped,,2014-04-01, @@ -118,10 +118,12 @@ cnt,status,intent,authoredon_month,medication_display 81,,order,2021-06-01, 81,,order,2021-02-01, 80,,,2021-08-01, +80,,,2020-06-01, 80,,,2017-01-01, 80,,,2016-02-01, 80,,,2015-01-01, 80,,order,2021-08-01, +80,,order,2020-06-01, 80,,order,2017-01-01, 80,,order,2016-02-01, 80,,order,2015-01-01, @@ -136,15 +138,19 @@ cnt,status,intent,authoredon_month,medication_display 80,stopped,order,2019-08-01, 80,stopped,order,2016-02-01, 79,,,2022-06-01, -79,,,2020-06-01, +79,,,2021-01-01, 79,,,2018-05-01, 79,,,2016-01-01, 79,,order,2022-06-01, -79,,order,2020-06-01, +79,,order,2021-01-01, 79,,order,2018-05-01, 79,,order,2016-01-01, +79,stopped,,2021-01-01, +79,stopped,,2020-06-01, 79,stopped,,2016-01-01, 79,stopped,,2015-01-01, +79,stopped,order,2021-01-01, +79,stopped,order,2020-06-01, 79,stopped,order,2016-01-01, 79,stopped,order,2015-01-01, 78,,,2022-07-01, @@ -171,34 +177,28 @@ cnt,status,intent,authoredon_month,medication_display 77,,order,2020-02-01, 77,stopped,,2021-12-01, 77,stopped,,2020-08-01, -77,stopped,,2020-06-01, 77,stopped,,2019-05-01, 77,stopped,,2019-01-01, 77,stopped,,2018-08-01, 77,stopped,,2018-05-01, 77,stopped,order,2021-12-01, 77,stopped,order,2020-08-01, -77,stopped,order,2020-06-01, 77,stopped,order,2019-05-01, 77,stopped,order,2019-01-01, 77,stopped,order,2018-08-01, 77,stopped,order,2018-05-01, 76,,,,Acetaminophen 300 MG / Hydrocodone Bitartrate 5 MG Oral Tablet 76,,,2021-07-01, -76,,,2021-01-01, 76,,,2017-05-01, 76,,,2015-04-01, 76,,order,,Acetaminophen 300 MG / Hydrocodone Bitartrate 5 MG Oral Tablet 76,,order,2021-07-01, -76,,order,2021-01-01, 76,,order,2017-05-01, 76,,order,2015-04-01, -76,stopped,,2021-01-01, 76,stopped,,2020-02-01, 76,stopped,,2017-07-01, 76,stopped,,2017-05-01, 76,stopped,,2015-04-01, -76,stopped,order,2021-01-01, 76,stopped,order,2020-02-01, 76,stopped,order,2017-07-01, 76,stopped,order,2017-05-01, @@ -207,6 +207,7 @@ cnt,status,intent,authoredon_month,medication_display 76,active,order,,Acetaminophen 300 MG / Hydrocodone Bitartrate 5 MG Oral Tablet 75,,,2021-10-01, 75,,,2021-05-01, +75,,,2020-10-01, 75,,,2015-02-01, 75,,,2014-12-01, 75,,,2014-09-01, @@ -214,6 +215,7 @@ cnt,status,intent,authoredon_month,medication_display 75,,,2014-06-01, 75,,order,2021-10-01, 75,,order,2021-05-01, +75,,order,2020-10-01, 75,,order,2015-02-01, 75,,order,2014-12-01, 75,,order,2014-09-01, @@ -227,20 +229,20 @@ cnt,status,intent,authoredon_month,medication_display 75,stopped,order,2015-02-01, 75,stopped,order,2014-12-01, 75,stopped,order,2014-09-01, -74,,,2020-10-01, 74,,,2020-05-01, 74,,,2018-06-01, -74,,order,2020-10-01, 74,,order,2020-05-01, 74,,order,2018-06-01, 74,stopped,,2022-03-01, 74,stopped,,2021-10-01, 74,stopped,,2021-07-01, +74,stopped,,2020-10-01, 74,stopped,,2020-01-01, 74,stopped,,2018-06-01, 74,stopped,order,2022-03-01, 74,stopped,order,2021-10-01, 74,stopped,order,2021-07-01, +74,stopped,order,2020-10-01, 74,stopped,order,2020-01-01, 74,stopped,order,2018-06-01, 73,,,2022-12-01, @@ -249,57 +251,55 @@ cnt,status,intent,authoredon_month,medication_display 73,,,2022-05-01, 73,,,2018-11-01, 73,,,2018-01-01, +73,,,2016-09-01, 73,,order,2022-12-01, 73,,order,2022-10-01, 73,,order,2022-08-01, 73,,order,2022-05-01, 73,,order,2018-11-01, 73,,order,2018-01-01, -73,stopped,,2020-10-01, +73,,order,2016-09-01, 73,stopped,,2020-05-01, 73,stopped,,2018-11-01, 73,stopped,,2018-01-01, +73,stopped,,2016-09-01, 73,stopped,,2014-07-01, -73,stopped,order,2020-10-01, 73,stopped,order,2020-05-01, 73,stopped,order,2018-11-01, 73,stopped,order,2018-01-01, +73,stopped,order,2016-09-01, 73,stopped,order,2014-07-01, 72,,,2022-09-01, 72,,,2021-04-01, +72,,,2019-10-01, 72,,,2017-09-01, -72,,,2016-09-01, 72,,,2016-08-01, 72,,,2016-03-01, 72,,order,2022-09-01, 72,,order,2021-04-01, +72,,order,2019-10-01, 72,,order,2017-09-01, -72,,order,2016-09-01, 72,,order,2016-08-01, 72,,order,2016-03-01, 72,stopped,,2021-04-01, +72,stopped,,2019-10-01, 72,stopped,,2017-09-01, -72,stopped,,2016-09-01, +72,stopped,,2016-08-01, 72,stopped,order,2021-04-01, +72,stopped,order,2019-10-01, 72,stopped,order,2017-09-01, -72,stopped,order,2016-09-01, +72,stopped,order,2016-08-01, 71,,,2023-02-01, 71,,,2020-09-01, -71,,,2019-10-01, 71,,,2017-10-01, 71,,,2017-06-01, 71,,order,2023-02-01, 71,,order,2020-09-01, -71,,order,2019-10-01, 71,,order,2017-10-01, 71,,order,2017-06-01, 71,stopped,,2020-09-01, -71,stopped,,2019-10-01, -71,stopped,,2016-08-01, 71,stopped,,2014-06-01, 71,stopped,order,2020-09-01, -71,stopped,order,2019-10-01, -71,stopped,order,2016-08-01, 71,stopped,order,2014-06-01, 70,stopped,,2017-10-01, 70,stopped,,2016-03-01, @@ -321,11 +321,13 @@ cnt,status,intent,authoredon_month,medication_display 69,stopped,order,2015-11-01, 68,,,2023-01-01, 68,,,2022-02-01, +68,,,2019-11-01, 68,,,2018-09-01, 68,,,2016-12-01, 68,,,2015-06-01, 68,,order,2023-01-01, 68,,order,2022-02-01, +68,,order,2019-11-01, 68,,order,2018-09-01, 68,,order,2016-12-01, 68,,order,2015-06-01, @@ -337,52 +339,62 @@ cnt,status,intent,authoredon_month,medication_display 68,stopped,order,2017-06-01, 68,stopped,order,2016-12-01, 68,stopped,order,2015-06-01, -67,,,2019-11-01, 67,,,2019-06-01, 67,,,2017-12-01, 67,,,2017-08-01, 67,,,2016-07-01, 67,,,2015-03-01, -67,,order,2019-11-01, 67,,order,2019-06-01, 67,,order,2017-12-01, 67,,order,2017-08-01, 67,,order,2016-07-01, 67,,order,2015-03-01, +67,stopped,,2019-11-01, 67,stopped,,2018-09-01, 67,stopped,,2017-12-01, 67,stopped,,2017-08-01, 67,stopped,,2016-07-01, +67,stopped,order,2019-11-01, 67,stopped,order,2018-09-01, 67,stopped,order,2017-12-01, 67,stopped,order,2017-08-01, 67,stopped,order,2016-07-01, +66,,,2018-02-01, 66,,,2016-05-01, 66,,,2014-08-01, +66,,order,2018-02-01, 66,,order,2016-05-01, 66,,order,2014-08-01, -66,stopped,,2019-11-01, 66,stopped,,2019-06-01, 66,stopped,,2015-03-01, -66,stopped,order,2019-11-01, 66,stopped,order,2019-06-01, 66,stopped,order,2015-03-01, +65,,,2020-12-01, +65,,,2020-11-01, 65,,,2018-04-01, -65,,,2018-02-01, 65,,,2017-11-01, 65,,,2016-06-01, 65,,,2015-05-01, 65,,,2013-01-01, +65,,order,2020-12-01, +65,,order,2020-11-01, 65,,order,2018-04-01, -65,,order,2018-02-01, 65,,order,2017-11-01, 65,,order,2016-06-01, 65,,order,2015-05-01, 65,,order,2013-01-01, +65,stopped,,2020-12-01, 65,stopped,,2018-04-01, +65,stopped,,2018-02-01, +65,stopped,,2017-11-01, +65,stopped,,2016-06-01, 65,stopped,,2015-05-01, 65,stopped,,2013-01-01, +65,stopped,order,2020-12-01, 65,stopped,order,2018-04-01, +65,stopped,order,2018-02-01, +65,stopped,order,2017-11-01, +65,stopped,order,2016-06-01, 65,stopped,order,2015-05-01, 65,stopped,order,2013-01-01, 64,,,2021-11-01, @@ -390,6 +402,7 @@ cnt,status,intent,authoredon_month,medication_display 64,,,2019-07-01, 64,,,2019-04-01, 64,,,2017-02-01, +64,,,2015-12-01, 64,,,2015-07-01, 64,,,2012-01-01, 64,,order,2021-11-01, @@ -397,56 +410,47 @@ cnt,status,intent,authoredon_month,medication_display 64,,order,2019-07-01, 64,,order,2019-04-01, 64,,order,2017-02-01, +64,,order,2015-12-01, 64,,order,2015-07-01, 64,,order,2012-01-01, +64,stopped,,2020-11-01, 64,stopped,,2019-04-01, -64,stopped,,2018-02-01, -64,stopped,,2017-11-01, 64,stopped,,2017-02-01, -64,stopped,,2016-06-01, +64,stopped,,2016-05-01, +64,stopped,,2015-07-01, +64,stopped,order,2020-11-01, 64,stopped,order,2019-04-01, -64,stopped,order,2018-02-01, -64,stopped,order,2017-11-01, 64,stopped,order,2017-02-01, -64,stopped,order,2016-06-01, -63,,,2020-11-01, +64,stopped,order,2016-05-01, +64,stopped,order,2015-07-01, 63,,,2020-04-01, -63,,,2015-12-01, +63,,,2015-10-01, 63,,,2015-09-01, 63,,,2009-12-01, -63,,order,2020-11-01, 63,,order,2020-04-01, -63,,order,2015-12-01, +63,,order,2015-10-01, 63,,order,2015-09-01, 63,,order,2009-12-01, 63,stopped,,2021-11-01, 63,stopped,,2020-04-01, 63,stopped,,2019-07-01, -63,stopped,,2016-05-01, -63,stopped,,2015-07-01, +63,stopped,,2015-12-01, +63,stopped,,2015-09-01, 63,stopped,,2009-12-01, 63,stopped,order,2021-11-01, 63,stopped,order,2020-04-01, 63,stopped,order,2019-07-01, -63,stopped,order,2016-05-01, -63,stopped,order,2015-07-01, +63,stopped,order,2015-12-01, +63,stopped,order,2015-09-01, 63,stopped,order,2009-12-01, -62,,,2020-12-01, -62,,,2015-10-01, 62,,,2013-10-01, -62,,order,2020-12-01, -62,,order,2015-10-01, 62,,order,2013-10-01, -62,stopped,,2020-11-01, 62,stopped,,2020-07-01, -62,stopped,,2015-12-01, -62,stopped,,2015-09-01, +62,stopped,,2015-10-01, 62,stopped,,2014-08-01, 62,stopped,,2012-01-01, -62,stopped,order,2020-11-01, 62,stopped,order,2020-07-01, -62,stopped,order,2015-12-01, -62,stopped,order,2015-09-01, +62,stopped,order,2015-10-01, 62,stopped,order,2014-08-01, 62,stopped,order,2012-01-01, 61,,,2016-10-01, @@ -457,11 +461,7 @@ cnt,status,intent,authoredon_month,medication_display 61,,order,2015-08-01, 61,,order,2014-11-01, 61,,order,2007-12-01, -61,stopped,,2020-12-01, -61,stopped,,2015-10-01, 61,stopped,,2007-12-01, -61,stopped,order,2020-12-01, -61,stopped,order,2015-10-01, 61,stopped,order,2007-12-01, 60,,,2018-12-01, 60,,,2016-04-01, @@ -472,14 +472,14 @@ cnt,status,intent,authoredon_month,medication_display 60,stopped,,2018-12-01, 60,stopped,,2016-04-01, 60,stopped,,2015-08-01, +60,stopped,,2014-11-01, 60,stopped,order,2018-12-01, 60,stopped,order,2016-04-01, 60,stopped,order,2015-08-01, +60,stopped,order,2014-11-01, 59,stopped,,2016-10-01, -59,stopped,,2014-11-01, 59,stopped,,2013-10-01, 59,stopped,order,2016-10-01, -59,stopped,order,2014-11-01, 59,stopped,order,2013-10-01, 58,,,2018-07-01, 58,,,2016-11-01, @@ -535,31 +535,33 @@ cnt,status,intent,authoredon_month,medication_display 53,stopped,order,2011-12-01, 52,,,2017-04-01, 52,,,2013-07-01, +52,,,2013-04-01, 52,,,2010-01-01, 52,,order,2017-04-01, 52,,order,2013-07-01, +52,,order,2013-04-01, 52,,order,2010-01-01, 52,stopped,,,24 HR tacrolimus 1 MG Extended Release Oral Tablet 52,stopped,,2013-07-01, +52,stopped,,2013-05-01, 52,stopped,,2010-01-01, 52,stopped,order,,24 HR tacrolimus 1 MG Extended Release Oral Tablet 52,stopped,order,2013-07-01, +52,stopped,order,2013-05-01, 52,stopped,order,2010-01-01, 51,,,2013-06-01, -51,,,2013-04-01, 51,,,2012-09-01, 51,,,2010-03-01, 51,,,2009-04-01, 51,,order,2013-06-01, -51,,order,2013-04-01, 51,,order,2012-09-01, 51,,order,2010-03-01, 51,,order,2009-04-01, 51,stopped,,2017-04-01, -51,stopped,,2013-05-01, +51,stopped,,2013-04-01, 51,stopped,,2010-12-01, 51,stopped,order,2017-04-01, -51,stopped,order,2013-05-01, +51,stopped,order,2013-04-01, 51,stopped,order,2010-12-01, 50,,,2012-05-01, 50,,,2011-05-01, @@ -571,12 +573,10 @@ cnt,status,intent,authoredon_month,medication_display 50,,order,2009-03-01, 50,stopped,,2022-07-01, 50,stopped,,2013-06-01, -50,stopped,,2013-04-01, 50,stopped,,2010-03-01, 50,stopped,,2009-04-01, 50,stopped,order,2022-07-01, 50,stopped,order,2013-06-01, -50,stopped,order,2013-04-01, 50,stopped,order,2010-03-01, 50,stopped,order,2009-04-01, 49,,,2011-01-01, @@ -588,22 +588,28 @@ cnt,status,intent,authoredon_month,medication_display 49,stopped,order,2022-06-01, 49,stopped,order,2010-08-01, 48,,,,Aspirin 81 MG Oral Tablet +48,,,2009-01-01, 48,,,2004-11-01, 48,,,2003-11-01, 48,,order,,Aspirin 81 MG Oral Tablet +48,,order,2009-01-01, 48,,order,2004-11-01, 48,,order,2003-11-01, 48,stopped,,,Aspirin 81 MG Oral Tablet 48,stopped,,2012-09-01, 48,stopped,,2012-05-01, +48,stopped,,2011-05-01, 48,stopped,,2011-01-01, +48,stopped,,2009-01-01, 48,stopped,,2008-09-01, 48,stopped,,2004-11-01, 48,stopped,,2003-11-01, 48,stopped,order,,Aspirin 81 MG Oral Tablet 48,stopped,order,2012-09-01, 48,stopped,order,2012-05-01, +48,stopped,order,2011-05-01, 48,stopped,order,2011-01-01, +48,stopped,order,2009-01-01, 48,stopped,order,2008-09-01, 48,stopped,order,2004-11-01, 48,stopped,order,2003-11-01, @@ -613,23 +619,17 @@ cnt,status,intent,authoredon_month,medication_display 47,,,2012-10-01, 47,,,2010-10-01, 47,,,2010-05-01, -47,,,2009-01-01, 47,,,2002-11-01, 47,,order,2013-11-01, 47,,order,2012-10-01, 47,,order,2010-10-01, 47,,order,2010-05-01, -47,,order,2009-01-01, 47,,order,2002-11-01, -47,stopped,,2011-05-01, 47,stopped,,2010-10-01, 47,stopped,,2009-03-01, -47,stopped,,2009-01-01, 47,stopped,,2002-11-01, -47,stopped,order,2011-05-01, 47,stopped,order,2010-10-01, 47,stopped,order,2009-03-01, -47,stopped,order,2009-01-01, 47,stopped,order,2002-11-01, 46,,,,Ibuprofen 400 MG Oral Tablet [Ibu] 46,,,2011-11-01, @@ -646,11 +646,13 @@ cnt,status,intent,authoredon_month,medication_display 46,,order,2009-05-01, 46,,order,2006-12-01, 46,stopped,,,Ibuprofen 400 MG Oral Tablet [Ibu] +46,stopped,,2022-04-01, 46,stopped,,2013-11-01, 46,stopped,,2012-10-01, 46,stopped,,2011-11-01, 46,stopped,,2011-09-01, 46,stopped,order,,Ibuprofen 400 MG Oral Tablet [Ibu] +46,stopped,order,2022-04-01, 46,stopped,order,2013-11-01, 46,stopped,order,2012-10-01, 46,stopped,order,2011-11-01, @@ -672,7 +674,6 @@ cnt,status,intent,authoredon_month,medication_display 45,,order,2005-11-01, 45,,order,2000-11-01, 45,stopped,,2022-05-01, -45,stopped,,2022-04-01, 45,stopped,,2012-11-01, 45,stopped,,2011-08-01, 45,stopped,,2010-05-01, @@ -681,7 +682,6 @@ cnt,status,intent,authoredon_month,medication_display 45,stopped,,2005-11-01, 45,stopped,,2000-11-01, 45,stopped,order,2022-05-01, -45,stopped,order,2022-04-01, 45,stopped,order,2012-11-01, 45,stopped,order,2011-08-01, 45,stopped,order,2010-05-01, @@ -986,6 +986,7 @@ cnt,status,intent,authoredon_month,medication_display 37,stopped,,2018-03-01,lisinopril 10 MG Oral Tablet 37,stopped,,2010-02-01, 37,stopped,,2009-11-01, +37,stopped,,2006-06-01, 37,stopped,,2001-03-01, 37,stopped,,2000-06-01, 37,stopped,,2000-03-01, @@ -997,6 +998,7 @@ cnt,status,intent,authoredon_month,medication_display 37,stopped,order,2018-03-01,lisinopril 10 MG Oral Tablet 37,stopped,order,2010-02-01, 37,stopped,order,2009-11-01, +37,stopped,order,2006-06-01, 37,stopped,order,2001-03-01, 37,stopped,order,2000-06-01, 37,stopped,order,2000-03-01, @@ -1037,7 +1039,6 @@ cnt,status,intent,authoredon_month,medication_display 36,stopped,,2014-05-01,lisinopril 10 MG Oral Tablet 36,stopped,,2014-01-01,lisinopril 10 MG Oral Tablet 36,stopped,,2010-06-01, -36,stopped,,2006-06-01, 36,stopped,,2002-12-01, 36,stopped,,2002-02-01, 36,stopped,order,2022-12-01, @@ -1046,7 +1047,6 @@ cnt,status,intent,authoredon_month,medication_display 36,stopped,order,2014-05-01,lisinopril 10 MG Oral Tablet 36,stopped,order,2014-01-01,lisinopril 10 MG Oral Tablet 36,stopped,order,2010-06-01, -36,stopped,order,2006-06-01, 36,stopped,order,2002-12-01, 36,stopped,order,2002-02-01, 36,active,,,Fexofenadine hydrochloride 30 MG Oral Tablet @@ -1328,6 +1328,7 @@ cnt,status,intent,authoredon_month,medication_display 33,stopped,,2003-12-01, 33,stopped,,2003-05-01, 33,stopped,,2002-04-01, +33,stopped,,2001-12-01, 33,stopped,,2001-10-01, 33,stopped,,2001-04-01, 33,stopped,,2000-08-01, @@ -1359,6 +1360,7 @@ cnt,status,intent,authoredon_month,medication_display 33,stopped,order,2003-12-01, 33,stopped,order,2003-05-01, 33,stopped,order,2002-04-01, +33,stopped,order,2001-12-01, 33,stopped,order,2001-10-01, 33,stopped,order,2001-04-01, 33,stopped,order,2000-08-01, @@ -1438,7 +1440,6 @@ cnt,status,intent,authoredon_month,medication_display 32,stopped,,2005-03-01, 32,stopped,,2005-01-01, 32,stopped,,2004-03-01, -32,stopped,,2001-12-01, 32,stopped,,2000-09-01, 32,stopped,,2000-02-01, 32,stopped,,1999-06-01, @@ -1465,7 +1466,6 @@ cnt,status,intent,authoredon_month,medication_display 32,stopped,order,2005-03-01, 32,stopped,order,2005-01-01, 32,stopped,order,2004-03-01, -32,stopped,order,2001-12-01, 32,stopped,order,2000-09-01, 32,stopped,order,2000-02-01, 32,stopped,order,1999-06-01, @@ -3411,6 +3411,7 @@ cnt,status,intent,authoredon_month,medication_display 22,stopped,order,1987-01-01, 22,stopped,order,1986-08-01, 22,stopped,order,1986-06-01, +21,,,,aspirin 325 MG Oral Tablet 21,,,2020-07-01,lisinopril 10 MG Oral Tablet 21,,,2018-12-01,Hydrochlorothiazide 25 MG Oral Tablet 21,,,2018-05-01,Hydrochlorothiazide 25 MG Oral Tablet @@ -3476,6 +3477,7 @@ cnt,status,intent,authoredon_month,medication_display 21,,,1984-11-01, 21,,,1983-05-01, 21,,,1980-11-01, +21,,order,,aspirin 325 MG Oral Tablet 21,,order,2020-07-01,lisinopril 10 MG Oral Tablet 21,,order,2018-12-01,Hydrochlorothiazide 25 MG Oral Tablet 21,,order,2018-05-01,Hydrochlorothiazide 25 MG Oral Tablet @@ -3541,6 +3543,7 @@ cnt,status,intent,authoredon_month,medication_display 21,,order,1984-11-01, 21,,order,1983-05-01, 21,,order,1980-11-01, +21,stopped,,,aspirin 325 MG Oral Tablet 21,stopped,,,albuterol 0.83 MG/ML Inhalation Solution 21,stopped,,2022-06-01,lisinopril 10 MG Oral Tablet 21,stopped,,2020-07-01,lisinopril 10 MG Oral Tablet @@ -3602,6 +3605,7 @@ cnt,status,intent,authoredon_month,medication_display 21,stopped,,1986-04-01, 21,stopped,,1985-08-01, 21,stopped,,1980-11-01, +21,stopped,order,,aspirin 325 MG Oral Tablet 21,stopped,order,,albuterol 0.83 MG/ML Inhalation Solution 21,stopped,order,2022-06-01,lisinopril 10 MG Oral Tablet 21,stopped,order,2020-07-01,lisinopril 10 MG Oral Tablet @@ -5137,6 +5141,7 @@ cnt,status,intent,authoredon_month,medication_display 16,stopped,,1986-09-01,lisinopril 10 MG Oral Tablet 16,stopped,,1986-02-01, 16,stopped,,1985-07-01, +16,stopped,,1984-06-01, 16,stopped,,1983-03-01, 16,stopped,,1982-05-01, 16,stopped,,1982-04-01, @@ -5209,6 +5214,7 @@ cnt,status,intent,authoredon_month,medication_display 16,stopped,order,1986-09-01,lisinopril 10 MG Oral Tablet 16,stopped,order,1986-02-01, 16,stopped,order,1985-07-01, +16,stopped,order,1984-06-01, 16,stopped,order,1983-03-01, 16,stopped,order,1982-05-01, 16,stopped,order,1982-04-01, @@ -5434,7 +5440,6 @@ cnt,status,intent,authoredon_month,medication_display 15,stopped,,1986-11-01, 15,stopped,,1985-04-01, 15,stopped,,1985-03-01, -15,stopped,,1984-06-01, 15,stopped,,1984-04-01, 15,stopped,,1983-10-01, 15,stopped,,1983-04-01, @@ -5511,7 +5516,6 @@ cnt,status,intent,authoredon_month,medication_display 15,stopped,order,1986-11-01, 15,stopped,order,1985-04-01, 15,stopped,order,1985-03-01, -15,stopped,order,1984-06-01, 15,stopped,order,1984-04-01, 15,stopped,order,1983-10-01, 15,stopped,order,1983-04-01, diff --git a/tests/regression/reference/core__count_medicationrequest_month.parquet b/tests/regression/reference/core__count_medicationrequest_month.parquet index 052118be76ec02293074fdd8f572310417be6321..2f9d4fb202beefadbf7cd337abefc744beeb9fed 100644 GIT binary patch delta 12367 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