diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 00000000..5008ddfc
Binary files /dev/null and b/.DS_Store differ
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 00000000..4badee0b
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,9 @@
+{
+ "java.configuration.updateBuildConfiguration": "interactive",
+ "files.exclude": {
+ "**/.classpath": true,
+ "**/.project": true,
+ "**/.settings": true,
+ "**/.factorypath": true
+ }
+}
\ No newline at end of file
diff --git a/CIRCE.srctrlbm b/CIRCE.srctrlbm
new file mode 100644
index 00000000..4ed30e15
Binary files /dev/null and b/CIRCE.srctrlbm differ
diff --git a/CIRCE.srctrldb b/CIRCE.srctrldb
new file mode 100644
index 00000000..df4e6563
Binary files /dev/null and b/CIRCE.srctrldb differ
diff --git a/CIRCE.srctrlprj b/CIRCE.srctrlprj
new file mode 100644
index 00000000..3824d6ae
--- /dev/null
+++ b/CIRCE.srctrlprj
@@ -0,0 +1,19 @@
+
+
+
+
+ 12
+
+ pom.xml
+ 0
+
+ Java Source Group from Maven
+
+ .java
+
+ enabled
+ Java Source Group from Maven
+
+
+ 8
+
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index 8dada3ed..00000000
--- a/LICENSE
+++ /dev/null
@@ -1,201 +0,0 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "{}"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright {yyyy} {name of copyright owner}
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml
new file mode 100644
index 00000000..35dbed7e
--- /dev/null
+++ b/dependency-reduced-pom.xml
@@ -0,0 +1,244 @@
+
+
+ 4.0.0
+ org.ohdsi
+ circe
+ 1.9.0-SNAPSHOT
+
+
+
+ maven-shade-plugin
+ 3.2.4
+
+
+ package
+
+ shade
+
+
+
+
+
+
+
+
+ org.jacoco
+ jacoco-maven-plugin
+ 0.8.5
+
+
+ pre-unit-test
+
+ prepare-agent
+
+
+ ${project.build.directory}/coverage-reports/jacoco-ut.exec
+ surefireArgLine
+
+
+
+ post-unit-test
+ test
+
+ report
+
+
+ ${project.build.directory}/coverage-reports/jacoco-ut.exec
+ ${project.reporting.outputDirectory}/jacoco-ut
+
+
+
+
+
+ maven-surefire-plugin
+ 2.15
+
+ ${surefireArgLine}
+ ${skip.unit.tests}
+
+ **/IT*.java
+
+
+
+
+
+
+
+ ohdsi
+ repo.ohdsi.org
+ http://repo.ohdsi.org:8085/nexus/content/repositories/releases
+
+
+ ohdsi.thirdparty
+ repo.ohdsi.org
+ http://repo.ohdsi.org:8085/nexus/content/repositories/thirdparty
+
+
+
+ false
+
+
+ ohdsi.snapshots
+ repo.ohdsi.org-snapshots
+ http://repo.ohdsi.org:8085/nexus/content/repositories/snapshots
+
+
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+ hamcrest-core
+ org.hamcrest
+
+
+
+
+ org.hamcrest
+ java-hamcrest
+ 2.0.0.0
+ test
+
+
+ com.opentable.components
+ otj-pg-embedded
+ 0.13.3
+ test
+
+
+ slf4j-api
+ org.slf4j
+
+
+ commons-compress
+ org.apache.commons
+
+
+ xz
+ org.tukaani
+
+
+ commons-codec
+ commons-codec
+
+
+ postgresql
+ org.postgresql
+
+
+ spotbugs-annotations
+ com.github.spotbugs
+
+
+ jcl-over-slf4j
+ org.slf4j
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ 1.5.20.RELEASE
+ test
+
+
+ spring-boot-test
+ org.springframework.boot
+
+
+ spring-boot-test-autoconfigure
+ org.springframework.boot
+
+
+ json-path
+ com.jayway.jsonpath
+
+
+ assertj-core
+ org.assertj
+
+
+ mockito-core
+ org.mockito
+
+
+ hamcrest-library
+ org.hamcrest
+
+
+ jsonassert
+ org.skyscreamer
+
+
+ spring-core
+ org.springframework
+
+
+ spring-test
+ org.springframework
+
+
+ hamcrest-core
+ org.hamcrest
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-jdbc
+ 1.5.20.RELEASE
+ test
+
+
+ spring-boot-starter
+ org.springframework.boot
+
+
+ tomcat-jdbc
+ org.apache.tomcat
+
+
+ spring-jdbc
+ org.springframework
+
+
+
+
+ org.dbunit
+ dbunit
+ 2.6.0
+ test
+
+
+ commons-collections
+ commons-collections
+
+
+ poi-ooxml
+ org.apache.poi
+
+
+ postgresql
+ postgresql
+
+
+ slf4j-api
+ org.slf4j
+
+
+
+
+ com.github.mjeanroy
+ dbunit-plus
+ 2.0.1
+ test
+
+
+
+ 1.8
+ 1.8
+
+
diff --git a/pom.xml b/pom.xml
index 10d26987..2cce86d7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -13,6 +13,23 @@
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ 3.2.4
+
+
+ package
+
+ shade
+
+
+
+
+
+
+
+
org.jacoco
jacoco-maven-plugin
@@ -138,7 +155,7 @@
org.ohdsi.sql
SqlRender
1.6.3
- test
+ compile
com.opentable.components
diff --git a/sourcetrail_dependencies/a0dfeb2e-8887-4025-8a71-60058de86a5f/maven/effective-pom.xml b/sourcetrail_dependencies/a0dfeb2e-8887-4025-8a71-60058de86a5f/maven/effective-pom.xml
new file mode 100644
index 00000000..498f323e
--- /dev/null
+++ b/sourcetrail_dependencies/a0dfeb2e-8887-4025-8a71-60058de86a5f/maven/effective-pom.xml
@@ -0,0 +1,384 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.0.0
+ org.ohdsi
+ circe
+ 1.9.0-SNAPSHOT
+
+ 1.8
+ 1.8
+
+
+
+ com.fasterxml.jackson.core
+ jackson-annotations
+ 2.9.9
+ compile
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ 2.9.10.4
+ compile
+
+
+ org.apache.commons
+ commons-lang3
+ 3.6
+ compile
+
+
+ commons-io
+ commons-io
+ 2.5
+ compile
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+ org.hamcrest
+ java-hamcrest
+ 2.0.0.0
+ test
+
+
+ org.ohdsi
+ standardized-analysis-utils
+ 1.2.0-SNAPSHOT
+ compile
+
+
+ org.ohdsi.sql
+ SqlRender
+ 1.6.3
+ test
+
+
+ com.opentable.components
+ otj-pg-embedded
+ 0.13.3
+ test
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ 1.5.20.RELEASE
+ test
+
+
+ org.springframework.boot
+ spring-boot-starter-jdbc
+ 1.5.20.RELEASE
+ test
+
+
+ org.dbunit
+ dbunit
+ 2.6.0
+ test
+
+
+ com.github.mjeanroy
+ dbunit-plus
+ 2.0.1
+ test
+
+
+
+
+ ohdsi
+ repo.ohdsi.org
+ http://repo.ohdsi.org:8085/nexus/content/repositories/releases
+
+
+ ohdsi.thirdparty
+ repo.ohdsi.org
+ http://repo.ohdsi.org:8085/nexus/content/repositories/thirdparty
+
+
+
+ false
+
+
+ true
+
+ ohdsi.snapshots
+ repo.ohdsi.org-snapshots
+ http://repo.ohdsi.org:8085/nexus/content/repositories/snapshots
+
+
+
+ false
+
+ central
+ Central Repository
+ https://repo.maven.apache.org/maven2
+
+
+
+
+
+ never
+
+
+ false
+
+ central
+ Central Repository
+ https://repo.maven.apache.org/maven2
+
+
+
+ /Volumes/git/repositories/circe-be/src/main/java
+ /Volumes/git/repositories/circe-be/src/main/scripts
+ /Volumes/git/repositories/circe-be/src/test/java
+ /Volumes/git/repositories/circe-be/target/classes
+ /Volumes/git/repositories/circe-be/target/test-classes
+
+
+ /Volumes/git/repositories/circe-be/src/main/resources
+
+
+
+
+ /Volumes/git/repositories/circe-be/src/test/resources
+
+
+ /Volumes/git/repositories/circe-be/target
+ circe-1.9.0-SNAPSHOT
+
+
+
+ maven-antrun-plugin
+ 1.3
+
+
+ maven-assembly-plugin
+ 2.2-beta-5
+
+
+ maven-dependency-plugin
+ 2.8
+
+
+ maven-release-plugin
+ 2.5.3
+
+
+
+
+
+ org.jacoco
+ jacoco-maven-plugin
+ 0.8.5
+
+
+ pre-unit-test
+
+ prepare-agent
+
+
+ /Volumes/git/repositories/circe-be/target/coverage-reports/jacoco-ut.exec
+ surefireArgLine
+
+
+
+ post-unit-test
+ test
+
+ report
+
+
+ /Volumes/git/repositories/circe-be/target/coverage-reports/jacoco-ut.exec
+ /Volumes/git/repositories/circe-be/target/site/jacoco-ut
+
+
+
+
+
+ maven-surefire-plugin
+ 2.15
+
+
+ default-test
+ test
+
+ test
+
+
+ ${surefireArgLine}
+ ${skip.unit.tests}
+
+ **/IT*.java
+
+
+
+
+
+ ${surefireArgLine}
+ ${skip.unit.tests}
+
+ **/IT*.java
+
+
+
+
+ maven-clean-plugin
+ 2.5
+
+
+ default-clean
+ clean
+
+ clean
+
+
+
+
+
+ maven-resources-plugin
+ 2.6
+
+
+ default-testResources
+ process-test-resources
+
+ testResources
+
+
+
+ default-resources
+ process-resources
+
+ resources
+
+
+
+
+
+ maven-jar-plugin
+ 2.4
+
+
+ default-jar
+ package
+
+ jar
+
+
+
+
+
+ maven-compiler-plugin
+ 3.1
+
+
+ default-compile
+ compile
+
+ compile
+
+
+
+ default-testCompile
+ test-compile
+
+ testCompile
+
+
+
+
+
+ maven-install-plugin
+ 2.4
+
+
+ default-install
+ install
+
+ install
+
+
+
+
+
+ maven-deploy-plugin
+ 2.7
+
+
+ default-deploy
+ deploy
+
+ deploy
+
+
+
+
+
+ maven-site-plugin
+ 3.3
+
+
+ default-site
+ site
+
+ site
+
+
+ /Volumes/git/repositories/circe-be/target/site
+
+
+ org.apache.maven.plugins
+ maven-project-info-reports-plugin
+
+
+
+
+
+ default-deploy
+ site-deploy
+
+ deploy
+
+
+ /Volumes/git/repositories/circe-be/target/site
+
+
+ org.apache.maven.plugins
+ maven-project-info-reports-plugin
+
+
+
+
+
+
+ /Volumes/git/repositories/circe-be/target/site
+
+
+ org.apache.maven.plugins
+ maven-project-info-reports-plugin
+
+
+
+
+
+
+
+ /Volumes/git/repositories/circe-be/target/site
+
+
diff --git a/src/main/java/org/ohdsi/circe/TestClass.java b/src/main/java/org/ohdsi/circe/TestClass.java
new file mode 100644
index 00000000..3d7cde8e
--- /dev/null
+++ b/src/main/java/org/ohdsi/circe/TestClass.java
@@ -0,0 +1,79 @@
+package org.ohdsi.circe;
+
+import java.io.*;
+import java.nio.charset.*;
+import org.apache.commons.io.*;
+
+import org.ohdsi.circe.cohortdefinition.CohortExpression;
+import org.ohdsi.circe.cohortdefinition.CohortExpressionQueryBuilder;
+import org.ohdsi.sql.SqlRender;
+
+public class TestClass {
+
+ private static CohortExpressionQueryBuilder.BuildExpressionQueryOptions buildExpressionQueryOptions(
+ final int cohortId, final String cdmSchema, final String resultSchema, final String targetTable, final String codelistDataset
+ ) {
+ final CohortExpressionQueryBuilder.BuildExpressionQueryOptions options = new CohortExpressionQueryBuilder.BuildExpressionQueryOptions();
+ options.cdmSchema = cdmSchema;
+ options.cohortId = cohortId;
+ options.generateStats = false;
+ options.resultSchema = resultSchema;
+ options.targetTable = targetTable;
+ options.codelistDataset = codelistDataset;
+ return options;
+ }
+
+ private static String buildExpressionSql(final CohortExpression expression,
+ final CohortExpressionQueryBuilder.BuildExpressionQueryOptions options) {
+ // build SQL
+ final CohortExpressionQueryBuilder builder = new CohortExpressionQueryBuilder();
+ String cohortSql = builder.buildExpressionQuery(expression, options);
+ return cohortSql;
+ }
+
+ private static String readFile(String path) throws IOException{
+ File file = new File(path);
+ return FileUtils.readFileToString(file, StandardCharsets.UTF_8);
+ }
+
+ public static String createSql(
+ int cohortId, String cdmSchema, String resultSchema,
+ String targetTable, String codelistDataset, String jsonString
+ ) throws IOException {
+
+ System.out.println("Parsing Json to SQL");
+
+ final CohortExpressionQueryBuilder.BuildExpressionQueryOptions options = buildExpressionQueryOptions(
+ cohortId,
+ cdmSchema,
+ resultSchema,
+ targetTable,
+ codelistDataset
+ );
+
+ final CohortExpression expression = CohortExpression.fromJson(jsonString);
+
+ String cohortSql = buildExpressionSql(expression, options);
+ cohortSql = SqlRender.renderSql(cohortSql, null, null);
+
+ return(cohortSql);
+ }
+
+ public static void main(String [] args) throws IOException {
+
+ final int cohortId = 1;
+ final String cdmSchema = "/UNITE/Safe Harbor/transform";
+ final String resultSchema = "";
+ final String targetTable = "/UNITE/Palantir/OHDSI/testing";
+ final String codelistDataset = "`/UNITE/Palantir/Applications/Development/Code Set Builder/hubble_base/concept_set_to_concept_id_edited`";
+
+ final String jsonFilePath = "/Users/bamor/Documents/active_projects/circe-be/test.json";
+ final String outputSqlFilePath = "/Users/bamor/Documents/active_projects/circe-be/test.sql";
+
+ final String jsonString = readFile(jsonFilePath);
+
+ final String cohortSql = createSql(cohortId, cdmSchema, resultSchema, targetTable, codelistDataset, jsonString);
+ FileUtils.writeStringToFile(new File(outputSqlFilePath), cohortSql, StandardCharsets.UTF_8);
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/org/ohdsi/circe/cohortdefinition/CohortExpressionQueryBuilder.java b/src/main/java/org/ohdsi/circe/cohortdefinition/CohortExpressionQueryBuilder.java
index dfcf24b6..694e1920 100644
--- a/src/main/java/org/ohdsi/circe/cohortdefinition/CohortExpressionQueryBuilder.java
+++ b/src/main/java/org/ohdsi/circe/cohortdefinition/CohortExpressionQueryBuilder.java
@@ -80,7 +80,7 @@ public class CohortExpressionQueryBuilder implements IGetCriteriaSqlDispatcher,
private final static String DATE_OFFSET_STRATEGY_TEMPLATE = ResourceHelper.GetResourceAsString("/resources/cohortdefinition/sql/dateOffsetStrategy.sql");
private final static String CUSTOM_ERA_STRATEGY_TEMPLATE = ResourceHelper.GetResourceAsString("/resources/cohortdefinition/sql/customEraStrategy.sql");
- private final static String DEFAULT_DRUG_EXPOSURE_END_DATE_EXPRESSION = "COALESCE(DRUG_EXPOSURE_END_DATE, DATEADD(day,DAYS_SUPPLY,DRUG_EXPOSURE_START_DATE), DATEADD(day,1,DRUG_EXPOSURE_START_DATE))";
+ private final static String DEFAULT_DRUG_EXPOSURE_END_DATE_EXPRESSION = "COALESCE(drug_exposure_end_date, date_add(drug_exposure_start_date, days_supply), date_add(drug_exposure_start_date, 1))";
// Builders
private final static ConditionOccurrenceSqlBuilder conditionOccurrenceSqlBuilder = new ConditionOccurrenceSqlBuilder<>();
@@ -125,6 +125,9 @@ public static class BuildExpressionQueryOptions {
@JsonProperty("generateStats")
public boolean generateStats;
+ @JsonProperty("codelistDataset")
+ public String codelistDataset;
+
public static CohortExpressionQueryBuilder.BuildExpressionQueryOptions fromJson(String json) {
try {
CohortExpressionQueryBuilder.BuildExpressionQueryOptions options
@@ -157,7 +160,7 @@ private String wrapCriteriaQuery(String query, CriteriaGroup group) {
String groupQuery = this.getCriteriaGroupQuery(group, String.format("(%s)", eventQuery));
groupQuery = StringUtils.replace(groupQuery, "@indexId", "" + 0);
String wrappedQuery = String.format(
- "select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM (\n%s\n) PE\nJOIN (\n%s) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id\n",
+ "select pe.person_id, pe.event_id, pe.start_date, pe.end_date, pe.TARGET_CONCEPT_ID, pe.visit_occurrence_id, pe.sort_date FROM (\n%s\n) pe\nJOIN (\n%s) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id\n",
query, groupQuery);
return wrappedQuery;
}
@@ -208,7 +211,7 @@ public String getPrimaryEventsQuery(PrimaryCriteria primaryCriteria) {
ArrayList primaryEventsFilters = new ArrayList<>();
primaryEventsFilters.add(String.format(
- "DATEADD(day,%d,OP.OBSERVATION_PERIOD_START_DATE) <= E.START_DATE AND DATEADD(day,%d,E.START_DATE) <= OP.OBSERVATION_PERIOD_END_DATE",
+ "date_add(op.observation_period_start_date, %d) <= E.start_date AND date_add(E.start_date, %d) <= op.observation_period_end_date",
primaryCriteria.observationWindow.priorDays,
primaryCriteria.observationWindow.postDays
)
@@ -224,8 +227,8 @@ public String getPrimaryEventsQuery(PrimaryCriteria primaryCriteria) {
public String getFinalCohortQuery(Period censorWindow) {
- String query = "select @target_cohort_id as @cohort_id_field_name, person_id, @start_date, @end_date \n"
- + "FROM #final_cohort CO";
+ String query = "select @target_cohort_id as @cohort_id_field_name, person_id as subject_id, @start_date as cohort_start_date, @end_date as cohort_end_date\n"
+ + "FROM final_cohort";
String startDate = "start_date";
String endDate = "end_date";
@@ -291,22 +294,18 @@ public String buildExpressionQuery(CohortExpression expression, BuildExpressionQ
String inclusionRuleInsert = getInclusionRuleQuery(cg);
inclusionRuleInsert = StringUtils.replace(inclusionRuleInsert, "@inclusion_rule_id", "" + i);
inclusionRuleInserts.add(inclusionRuleInsert);
- inclusionRuleTempTables.add(String.format("#Inclusion_%d", i));
+ inclusionRuleTempTables.add(String.format("Inclusion_%d", i));
}
-
String irTempUnion = inclusionRuleTempTables.stream()
.map(d -> String.format("select inclusion_rule_id, person_id, event_id from %s", d))
.collect(Collectors.joining("\nUNION ALL\n"));
- inclusionRuleInserts.add(String.format("SELECT inclusion_rule_id, person_id, event_id\nINTO #inclusion_events\nFROM (%s) I;", irTempUnion));
-
- inclusionRuleInserts.addAll(inclusionRuleTempTables.stream()
- .map(d -> String.format("TRUNCATE TABLE %s;\nDROP TABLE %s;\n", d, d))
- .collect(Collectors.toList())
- );
+ inclusionRuleInserts.add(String.format("inclusion_events AS (\nSELECT inclusion_rule_id, person_id, event_id\nFROM (%s) ), \n", irTempUnion));
+ System.out.println(StringUtils.join(inclusionRuleInserts, "\n"));
resultSql = StringUtils.replace(resultSql, "@inclusionCohortInserts", StringUtils.join(inclusionRuleInserts, "\n"));
} else {
- resultSql = StringUtils.replace(resultSql, "@inclusionCohortInserts", "create table #inclusion_events (inclusion_rule_id bigint,\n\tperson_id bigint,\n\tevent_id bigint\n);");
+ //resultSql = StringUtils.replace(resultSql, "@inclusionCohortInserts", "create table #inclusion_events (inclusion_rule_id bigint,\n\tperson_id bigint,\n\tevent_id bigint\n);");
+ resultSql = StringUtils.replace(resultSql, "@inclusionCohortInserts", "inclusion_events AS (\nSELECT null as inclusion_rule_id, null as person_id, null as event_id\n),");
}
resultSql = StringUtils.replace(resultSql, "@IncludedEventSort", (expression.expressionLimit.type != null && expression.expressionLimit.type.equalsIgnoreCase("LAST")) ? "DESC" : "ASC");
@@ -322,14 +321,13 @@ public String buildExpressionQuery(CohortExpression expression, BuildExpressionQ
ArrayList endDateSelects = new ArrayList<>();
if (!(expression.endStrategy instanceof DateOffsetStrategy)) {
- endDateSelects.add("-- By default, cohort exit at the event's op end date\nselect event_id, person_id, op_end_date as end_date from #included_events");
+ endDateSelects.add("-- By default, cohort exit at the event's op end date\nselect event_id as event_id1, person_id, op_end_date as end_date from included_events");
}
if (expression.endStrategy != null) {
// replace @strategy_ends placeholders with temp table creation and cleanup scripts.
- resultSql = StringUtils.replace(resultSql, "@strategy_ends_temp_tables", expression.endStrategy.accept(this, "#included_events"));
- resultSql = StringUtils.replace(resultSql, "@strategy_ends_cleanup", "TRUNCATE TABLE #strategy_ends;\nDROP TABLE #strategy_ends;\n");
- endDateSelects.add(String.format("-- End Date Strategy\n%s\n", "SELECT event_id, person_id, end_date from #strategy_ends"));
+ resultSql = StringUtils.replace(resultSql, "@strategy_ends_temp_tables", expression.endStrategy.accept(this, "included_events"));
+ endDateSelects.add(String.format("-- End Date Strategy\n%s\n", "SELECT event_id as event_id1, person_id, end_date from strategy_ends"));
} else {
// replace @trategy_ends placeholders with empty string
resultSql = StringUtils.replace(resultSql, "@strategy_ends_temp_tables", "");
@@ -346,8 +344,8 @@ public String buildExpressionQuery(CohortExpression expression, BuildExpressionQ
resultSql = StringUtils.replace(resultSql, "@eraconstructorpad", Integer.toString(expression.collapseSettings.eraPad));
- resultSql = StringUtils.replace(resultSql, "@inclusionImpactAnalysisByEventQuery", getInclusionAnalysisQuery("#qualified_events", 0));
- resultSql = StringUtils.replace(resultSql, "@inclusionImpactAnalysisByPersonQuery", getInclusionAnalysisQuery("#best_events", 1));
+ resultSql = StringUtils.replace(resultSql, "@inclusionImpactAnalysisByEventQuery", getInclusionAnalysisQuery("qualified_events", 0));
+ resultSql = StringUtils.replace(resultSql, "@inclusionImpactAnalysisByPersonQuery", getInclusionAnalysisQuery("best_events", 1));
resultSql = StringUtils.replace(resultSql, "@cohortCensoredStatsQuery",
(expression.censorWindow != null && (!StringUtils.isEmpty(expression.censorWindow.startDate) || !StringUtils.isEmpty(expression.censorWindow.endDate)))
@@ -373,6 +371,9 @@ public String buildExpressionQuery(CohortExpression expression, BuildExpressionQ
if (options.cohortId != null) {
resultSql = StringUtils.replace(resultSql, "@target_cohort_id", options.cohortId.toString());
}
+ if (options.codelistDataset != null) {
+ resultSql = StringUtils.replace(resultSql, "#Codesets", options.codelistDataset.toString());
+ }
resultSql = StringUtils.replace(resultSql, "@generateStats", options.generateStats ? "1" : "0");
@@ -456,7 +457,7 @@ public String getCriteriaGroupQuery(CriteriaGroup group, String eventTable) {
private String getInclusionRuleQuery(CriteriaGroup inclusionRule) {
String resultSql = INCLUSION_RULE_QUERY_TEMPLATE;
- String additionalCriteriaQuery = "\nJOIN (\n" + getCriteriaGroupQuery(inclusionRule, "#qualified_events") + ") AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id";
+ String additionalCriteriaQuery = "\nJOIN (\n" + getCriteriaGroupQuery(inclusionRule, "qualified_events") + ") AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id";
additionalCriteriaQuery = StringUtils.replace(additionalCriteriaQuery, "@indexId", "" + 0);
resultSql = StringUtils.replace(resultSql, "@additionalCriteriaQuery", additionalCriteriaQuery);
return resultSql;
@@ -526,17 +527,17 @@ public String getWindowedCriteriaQuery(String sqlTemplate, WindowedCriteria crit
String endExpression;
List clauses = new ArrayList<>();
if (checkObservationPeriod) {
- clauses.add("A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE");
+ clauses.add("A.start_date >= P.op_start_date AND A.start_date <= P.op_end_date");
}
// StartWindow
Window startWindow = criteria.startWindow;
- String startIndexDateExpression = (startWindow.useIndexEnd != null && startWindow.useIndexEnd) ? "P.END_DATE" : "P.START_DATE";
- String startEventDateExpression = (startWindow.useEventEnd != null && startWindow.useEventEnd) ? "A.END_DATE" : "A.START_DATE";
+ String startIndexDateExpression = (startWindow.useIndexEnd != null && startWindow.useIndexEnd) ? "P.end_date" : "P.start_date";
+ String startEventDateExpression = (startWindow.useEventEnd != null && startWindow.useEventEnd) ? "A.end_date" : "A.start_date";
if (startWindow.start.days != null) {
- startExpression = String.format("DATEADD(day,%d,%s)", startWindow.start.coeff * startWindow.start.days, startIndexDateExpression);
+ startExpression = String.format("date_add(%s, %d)", startIndexDateExpression, startWindow.start.coeff * startWindow.start.days);
} else {
- startExpression = checkObservationPeriod ? (startWindow.start.coeff == -1 ? "P.OP_START_DATE" : "P.OP_END_DATE") : null;
+ startExpression = checkObservationPeriod ? (startWindow.start.coeff == -1 ? "P.op_start_date" : "P.op_end_date") : null;
}
if (startExpression != null) {
@@ -544,9 +545,9 @@ public String getWindowedCriteriaQuery(String sqlTemplate, WindowedCriteria crit
}
if (startWindow.end.days != null) {
- endExpression = String.format("DATEADD(day,%d,%s)", startWindow.end.coeff * startWindow.end.days, startIndexDateExpression);
+ endExpression = String.format("date_add(%s, %d)", startIndexDateExpression, startWindow.end.coeff * startWindow.end.days);
} else {
- endExpression = checkObservationPeriod ? (startWindow.end.coeff == -1 ? "P.OP_START_DATE" : "P.OP_END_DATE") : null;
+ endExpression = checkObservationPeriod ? (startWindow.end.coeff == -1 ? "P.op_start_date" : "P.op_end_date") : null;
}
if (endExpression != null) {
@@ -557,13 +558,13 @@ public String getWindowedCriteriaQuery(String sqlTemplate, WindowedCriteria crit
Window endWindow = criteria.endWindow;
if (endWindow != null) {
- String endIndexDateExpression = (endWindow.useIndexEnd != null && endWindow.useIndexEnd) ? "P.END_DATE" : "P.START_DATE";
+ String endIndexDateExpression = (endWindow.useIndexEnd != null && endWindow.useIndexEnd) ? "P.end_date" : "P.start_date";
// for backwards compatability, having a null endWindow.useIndexEnd means they SHOULD use the index end date.
- String endEventDateExpression = (endWindow.useEventEnd == null || endWindow.useEventEnd) ? "A.END_DATE" : "A.START_DATE";
+ String endEventDateExpression = (endWindow.useEventEnd == null || endWindow.useEventEnd) ? "A.end_date" : "A.start_date";
if (endWindow.start.days != null) {
- startExpression = String.format("DATEADD(day,%d,%s)", endWindow.start.coeff * endWindow.start.days, endIndexDateExpression);
+ startExpression = String.format("date_add(%s, %d)", endIndexDateExpression, endWindow.start.coeff * endWindow.start.days);
} else {
- startExpression = checkObservationPeriod ? (endWindow.start.coeff == -1 ? "P.OP_START_DATE" : "P.OP_END_DATE") : null;
+ startExpression = checkObservationPeriod ? (endWindow.start.coeff == -1 ? "P.op_start_date" : "P.op_end_date") : null;
}
if (startExpression != null) {
@@ -571,9 +572,9 @@ public String getWindowedCriteriaQuery(String sqlTemplate, WindowedCriteria crit
}
if (endWindow.end.days != null) {
- endExpression = String.format("DATEADD(day,%d,%s)", endWindow.end.coeff * endWindow.end.days, endIndexDateExpression);
+ endExpression = String.format("date_add(%s, %d)", endIndexDateExpression, endWindow.end.coeff * endWindow.end.days);
} else {
- endExpression = checkObservationPeriod ? (endWindow.end.coeff == -1 ? "P.OP_START_DATE" : "P.OP_END_DATE") : null;
+ endExpression = checkObservationPeriod ? (endWindow.end.coeff == -1 ? "P.op_start_date" : "P.op_end_date") : null;
}
if (endExpression != null) {
@@ -739,7 +740,7 @@ public String getStrategySql(CustomEraStrategy strat, String eventTable) {
String drugExposureEndDateExpression = DEFAULT_DRUG_EXPOSURE_END_DATE_EXPRESSION;
if (strat.daysSupplyOverride != null) {
- drugExposureEndDateExpression = String.format("DATEADD(day,%d,DRUG_EXPOSURE_START_DATE)", strat.daysSupplyOverride);
+ drugExposureEndDateExpression = String.format("date_add(drug_exposure_start_date, %d)", strat.daysSupplyOverride);
}
String strategySql = StringUtils.replace(CUSTOM_ERA_STRATEGY_TEMPLATE, "@eventTable", eventTable);
strategySql = StringUtils.replace(strategySql, "@drugCodesetId", strat.drugCodesetId.toString());
diff --git a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/BuilderUtils.java b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/BuilderUtils.java
index cedbb439..d7e891b1 100644
--- a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/BuilderUtils.java
+++ b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/BuilderUtils.java
@@ -67,8 +67,9 @@ public static String getOperator(DateRange range) {
public static String dateStringToSql(String date) {
- String[] dateParts = StringUtils.split(date, '-');
- return String.format("DATEFROMPARTS(%s, %s, %s)", Integer.valueOf(dateParts[0]), Integer.valueOf(dateParts[1]), Integer.valueOf(dateParts[2]));
+ //String[] dateParts = StringUtils.split(date, '-');
+ //return String.format("date(%s, %s, %s)", Integer.valueOf(dateParts[0]), Integer.valueOf(dateParts[1]), Integer.valueOf(dateParts[2]));
+ return String.format("date('%s')", date);
}
public static String buildDateRangeClause(String sqlExpression, DateRange range) {
diff --git a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ConditionEraSqlBuilder.java b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ConditionEraSqlBuilder.java
index 61bf781b..9394dbb2 100644
--- a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ConditionEraSqlBuilder.java
+++ b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ConditionEraSqlBuilder.java
@@ -52,7 +52,7 @@ protected List resolveJoinClauses(T criteria) {
// join to PERSON
if (criteria.ageAtStart != null || criteria.ageAtEnd != null || (criteria.gender != null && criteria.gender.length > 0)) {
- joinClauses.add("JOIN @cdm_database_schema.PERSON P on C.person_id = P.person_id");
+ joinClauses.add("JOIN global_temp.person P on C.person_id = P.person_id");
}
return joinClauses;
@@ -80,7 +80,7 @@ protected List resolveWhereClauses(T criteria, Map addit
// eraLength
if (criteria.eraLength != null) {
- whereClauses.add(buildNumericRangeClause("DATEDIFF(d,C.condition_era_start_date, C.condition_era_end_date)", criteria.eraLength));
+ whereClauses.add(buildNumericRangeClause("DATEDIFF(C.condition_era_end_date, C.condition_era_start_date)", criteria.eraLength));
}
// ageAtStart
diff --git a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ConditionOccurrenceSqlBuilder.java b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ConditionOccurrenceSqlBuilder.java
index 2885a278..b521de5c 100644
--- a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ConditionOccurrenceSqlBuilder.java
+++ b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ConditionOccurrenceSqlBuilder.java
@@ -56,13 +56,13 @@ protected List resolveJoinClauses(T criteria) {
// join to PERSON
if (criteria.age != null || (criteria.gender != null && criteria.gender.length > 0)) {
- joinClauses.add("JOIN @cdm_database_schema.PERSON P on C.person_id = P.person_id");
+ joinClauses.add("JOIN @cdm_database_schema.person P on C.person_id = P.person_id");
}
if (criteria.visitType != null && criteria.visitType.length > 0) {
- joinClauses.add("JOIN @cdm_database_schema.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id");
+ joinClauses.add("JOIN @cdm_database_schema.visit_occurrence V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id");
}
if (criteria.providerSpecialty != null && criteria.providerSpecialty.length > 0) {
- joinClauses.add("LEFT JOIN @cdm_database_schema.PROVIDER PR on C.provider_id = PR.provider_id");
+ joinClauses.add("LEFT JOIN @cdm_database_schema.provider PR on C.provider_id = PR.provider_id");
}
return joinClauses;
diff --git a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DeathSqlBuilder.java b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DeathSqlBuilder.java
index 7088a63c..b0704012 100644
--- a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DeathSqlBuilder.java
+++ b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DeathSqlBuilder.java
@@ -47,7 +47,7 @@ protected List resolveJoinClauses(T criteria) {
// join to PERSON
if (criteria.age != null || (criteria.gender != null && criteria.gender.length > 0)) {
- joinClauses.add("JOIN @cdm_database_schema.PERSON P on C.person_id = P.person_id");
+ joinClauses.add("JOIN @cdm_database_schema.person P on C.person_id = P.person_id");
}
return joinClauses;
diff --git a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DeviceExposureSqlBuilder.java b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DeviceExposureSqlBuilder.java
index 6e5f5466..196fd395 100644
--- a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DeviceExposureSqlBuilder.java
+++ b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DeviceExposureSqlBuilder.java
@@ -55,13 +55,13 @@ protected List resolveJoinClauses(T criteria) {
// join to PERSON
if (criteria.age != null || (criteria.gender != null && criteria.gender.length > 0)) {
- joinClauses.add("JOIN @cdm_database_schema.PERSON P on C.person_id = P.person_id");
+ joinClauses.add("JOIN @cdm_database_schema.person P on C.person_id = P.person_id");
}
if (criteria.visitType != null && criteria.visitType.length > 0) {
- joinClauses.add("JOIN @cdm_database_schema.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id");
+ joinClauses.add("JOIN @cdm_database_schema.visit_occurrence V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id");
}
if (criteria.providerSpecialty != null && criteria.providerSpecialty.length > 0) {
- joinClauses.add("LEFT JOIN @cdm_database_schema.PROVIDER PR on C.provider_id = PR.provider_id");
+ joinClauses.add("LEFT JOIN @cdm_database_schema.provider PR on C.provider_id = PR.provider_id");
}
return joinClauses;
diff --git a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DoseEraSqlBuilder.java b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DoseEraSqlBuilder.java
index 7a00f9a0..918b0f02 100644
--- a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DoseEraSqlBuilder.java
+++ b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DoseEraSqlBuilder.java
@@ -53,7 +53,7 @@ protected List resolveJoinClauses(T criteria) {
// join to PERSON
if (criteria.ageAtStart != null || criteria.ageAtEnd != null || (criteria.gender != null && criteria.gender.length > 0)) {
- joinClauses.add("JOIN @cdm_database_schema.PERSON P on C.person_id = P.person_id");
+ joinClauses.add("JOIN @cdm_database_schema.person P on C.person_id = P.person_id");
}
return joinClauses;
@@ -86,7 +86,7 @@ protected List resolveWhereClauses(T criteria, Map addit
// eraLength
if (criteria.eraLength != null) {
- whereClauses.add(buildNumericRangeClause("DATEDIFF(d,C.dose_era_start_date, C.dose_era_end_date)", criteria.eraLength));
+ whereClauses.add(buildNumericRangeClause("DATEDIFF(C.dose_era_end_date, C.dose_era_start_date)", criteria.eraLength));
}
// ageAtStart
diff --git a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DrugEraSqlBuilder.java b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DrugEraSqlBuilder.java
index 8fe86850..1b1e39eb 100644
--- a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DrugEraSqlBuilder.java
+++ b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DrugEraSqlBuilder.java
@@ -52,7 +52,7 @@ protected List resolveJoinClauses(T criteria) {
// join to PERSON
if (criteria.ageAtStart != null || criteria.ageAtEnd != null || (criteria.gender != null && criteria.gender.length > 0)) {
- joinClauses.add("JOIN @cdm_database_schema.PERSON P on C.person_id = P.person_id");
+ joinClauses.add("JOIN @cdm_database_schema.person P on C.person_id = P.person_id");
}
return joinClauses;
@@ -80,7 +80,7 @@ protected List resolveWhereClauses(T criteria, Map addit
// eraLength
if (criteria.eraLength != null) {
- whereClauses.add(buildNumericRangeClause("DATEDIFF(d,C.drug_era_start_date, C.drug_era_end_date)", criteria.eraLength));
+ whereClauses.add(buildNumericRangeClause("DATEDIFF(C.drug_era_end_date, C.drug_era_start_date)", criteria.eraLength));
}
// gapDays
diff --git a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DrugExposureSqlBuilder.java b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DrugExposureSqlBuilder.java
index 7f13daaa..f63dcaa8 100644
--- a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DrugExposureSqlBuilder.java
+++ b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DrugExposureSqlBuilder.java
@@ -56,13 +56,13 @@ protected List resolveJoinClauses(T criteria) {
// join to PERSON
if (criteria.age != null || (criteria.gender != null && criteria.gender.length > 0)) {
- joinClauses.add("JOIN @cdm_database_schema.PERSON P on C.person_id = P.person_id");
+ joinClauses.add("JOIN @cdm_database_schema.person P on C.person_id = P.person_id");
}
if (criteria.visitType != null && criteria.visitType.length > 0) {
- joinClauses.add("JOIN @cdm_database_schema.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id");
+ joinClauses.add("JOIN @cdm_database_schema.visit_occurrence V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id");
}
if (criteria.providerSpecialty != null && criteria.providerSpecialty.length > 0) {
- joinClauses.add("LEFT JOIN @cdm_database_schema.PROVIDER PR on C.provider_id = PR.provider_id");
+ joinClauses.add("LEFT JOIN @cdm_database_schema.provider PR on C.provider_id = PR.provider_id");
}
return joinClauses;
diff --git a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/MeasurementSqlBuilder.java b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/MeasurementSqlBuilder.java
index de3f87f9..3ad9d042 100644
--- a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/MeasurementSqlBuilder.java
+++ b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/MeasurementSqlBuilder.java
@@ -55,13 +55,13 @@ protected List resolveJoinClauses(T criteria) {
// join to PERSON
if (criteria.age != null || (criteria.gender != null && criteria.gender.length > 0)) {
- joinClauses.add("JOIN @cdm_database_schema.PERSON P on C.person_id = P.person_id");
+ joinClauses.add("JOIN @cdm_database_schema.person P on C.person_id = P.person_id");
}
if (criteria.visitType != null && criteria.visitType.length > 0) {
- joinClauses.add("JOIN @cdm_database_schema.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id");
+ joinClauses.add("JOIN @cdm_database_schema.visit_occurrence V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id");
}
if (criteria.providerSpecialty != null && criteria.providerSpecialty.length > 0) {
- joinClauses.add("LEFT JOIN @cdm_database_schema.PROVIDER PR on C.provider_id = PR.provider_id");
+ joinClauses.add("LEFT JOIN @cdm_database_schema.provider PR on C.provider_id = PR.provider_id");
}
return joinClauses;
diff --git a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ObservationPeriodSqlBuilder.java b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ObservationPeriodSqlBuilder.java
index 6cc0f1fb..898b0c81 100644
--- a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ObservationPeriodSqlBuilder.java
+++ b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ObservationPeriodSqlBuilder.java
@@ -42,7 +42,7 @@ protected List resolveJoinClauses(T criteria) {
// join to PERSON
if (criteria.ageAtStart != null || criteria.ageAtEnd != null) {
- joinClauses.add("JOIN @cdm_database_schema.PERSON P on C.person_id = P.person_id");
+ joinClauses.add("JOIN @cdm_database_schema.person P on C.person_id = P.person_id");
}
return joinClauses;
@@ -65,12 +65,12 @@ protected List resolveWhereClauses(T criteria, Map addit
if (userDefinedPeriod.startDate != null) {
startDateExpression = BuilderUtils.dateStringToSql(userDefinedPeriod.startDate);
- whereClauses.add(String.format("C.OBSERVATION_PERIOD_START_DATE <= %s and C.OBSERVATION_PERIOD_END_DATE >= %s", startDateExpression, startDateExpression));
+ whereClauses.add(String.format("C.observation_period_start_date <= %s and C.observation_period_end_date >= %s", startDateExpression, startDateExpression));
}
if (userDefinedPeriod.endDate != null) {
endDateExpression = BuilderUtils.dateStringToSql(userDefinedPeriod.endDate);
- whereClauses.add(String.format("C.OBSERVATION_PERIOD_START_DATE <= %s and C.OBSERVATION_PERIOD_END_DATE >= %s", endDateExpression, endDateExpression));
+ whereClauses.add(String.format("C.observation_period_start_date <= %s and C.observation_period_end_date >= %s", endDateExpression, endDateExpression));
}
}
@@ -95,7 +95,7 @@ protected List resolveWhereClauses(T criteria, Map addit
// periodLength
if (criteria.periodLength != null) {
- whereClauses.add(buildNumericRangeClause("DATEDIFF(d,C.observation_period_start_date, C.observation_period_end_date)", criteria.periodLength));
+ whereClauses.add(buildNumericRangeClause("DATEDIFF(C.observation_period_end_date, C.observation_period_start_date)", criteria.periodLength));
}
// ageAtStart
diff --git a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ObservationSqlBuilder.java b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ObservationSqlBuilder.java
index 3437410b..33ede84b 100644
--- a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ObservationSqlBuilder.java
+++ b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ObservationSqlBuilder.java
@@ -56,13 +56,13 @@ protected List resolveJoinClauses(T criteria) {
// join to PERSON
if (criteria.age != null || (criteria.gender != null && criteria.gender.length > 0)) {
- joinClauses.add("JOIN @cdm_database_schema.PERSON P on C.person_id = P.person_id");
+ joinClauses.add("JOIN @cdm_database_schema.person P on C.person_id = P.person_id");
}
if (criteria.visitType != null && criteria.visitType.length > 0) {
- joinClauses.add("JOIN @cdm_database_schema.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id");
+ joinClauses.add("JOIN @cdm_database_schema.visit_occurrence V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id");
}
if (criteria.providerSpecialty != null && criteria.providerSpecialty.length > 0) {
- joinClauses.add("LEFT JOIN @cdm_database_schema.PROVIDER PR on C.provider_id = PR.provider_id");
+ joinClauses.add("LEFT JOIN @cdm_database_schema.provider PR on C.provider_id = PR.provider_id");
}
return joinClauses;
diff --git a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/PayerPlanPeriodSqlBuilder.java b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/PayerPlanPeriodSqlBuilder.java
index 6ff06fed..5f04f858 100644
--- a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/PayerPlanPeriodSqlBuilder.java
+++ b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/PayerPlanPeriodSqlBuilder.java
@@ -41,7 +41,7 @@ protected List resolveJoinClauses(T criteria) {
List joinClauses = new ArrayList<>();
if (criteria.ageAtStart != null || criteria.ageAtEnd != null || (criteria.gender != null && criteria.gender.length > 0)) {
- joinClauses.add("JOIN @cdm_database_schema.PERSON P on C.person_id = P.person_id");
+ joinClauses.add("JOIN @cdm_database_schema.person P on C.person_id = P.person_id");
}
return joinClauses;
@@ -66,12 +66,12 @@ protected List resolveWhereClauses(T criteria, Map addit
if (userDefinedPeriod.startDate != null) {
startDateExpression = BuilderUtils.dateStringToSql(userDefinedPeriod.startDate);
- whereClauses.add(String.format("C.PAYER_PLAN_PERIOD_START_DATE <= %s and C.PAYER_PLAN_PERIOD_END_DATE >= %s", startDateExpression, startDateExpression));
+ whereClauses.add(String.format("C.payer_plan_period_start_date <= %s and C.payer_plan_period_end_date >= %s", startDateExpression, startDateExpression));
}
if (userDefinedPeriod.endDate != null) {
endDateExpression = BuilderUtils.dateStringToSql(userDefinedPeriod.endDate);
- whereClauses.add(String.format("C.PAYER_PLAN_PERIOD_START_DATE <= %s and C.PAYER_PLAN_PERIOD_END_DATE >= %s", endDateExpression, endDateExpression));
+ whereClauses.add(String.format("C.payer_plan_period_start_date <= %s and C.payer_plan_period_end_date >= %s", endDateExpression, endDateExpression));
}
}
@@ -90,7 +90,7 @@ protected List resolveWhereClauses(T criteria, Map addit
//periodLength
if (criteria.periodLength != null) {
- whereClauses.add(buildNumericRangeClause("DATEDIFF(d,C.payer_plan_period_start_date, C.payer_plan_period_end_date)", criteria.periodLength));
+ whereClauses.add(buildNumericRangeClause("DATEDIFF(C.payer_plan_period_end_date, C.payer_plan_period_start_date)", criteria.periodLength));
}
//ageAtStart
diff --git a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ProcedureOccurrenceSqlBuilder.java b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ProcedureOccurrenceSqlBuilder.java
index 89cf29a8..cea0b921 100644
--- a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ProcedureOccurrenceSqlBuilder.java
+++ b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ProcedureOccurrenceSqlBuilder.java
@@ -54,13 +54,13 @@ protected List resolveJoinClauses(T criteria) {
// join to PERSON
if (criteria.age != null || (criteria.gender != null && criteria.gender.length > 0)) {
- joinClauses.add("JOIN @cdm_database_schema.PERSON P on C.person_id = P.person_id");
+ joinClauses.add("JOIN @cdm_database_schema.person P on C.person_id = P.person_id");
}
if (criteria.visitType != null && criteria.visitType.length > 0) {
- joinClauses.add("JOIN @cdm_database_schema.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id");
+ joinClauses.add("JOIN @cdm_database_schema.visit_occurrence V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id");
}
if (criteria.providerSpecialty != null && criteria.providerSpecialty.length > 0) {
- joinClauses.add("LEFT JOIN @cdm_database_schema.PROVIDER PR on C.provider_id = PR.provider_id");
+ joinClauses.add("LEFT JOIN @cdm_database_schema.provider PR on C.provider_id = PR.provider_id");
}
return joinClauses;
diff --git a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/SpecimenSqlBuilder.java b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/SpecimenSqlBuilder.java
index a158b2f1..e8212e64 100644
--- a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/SpecimenSqlBuilder.java
+++ b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/SpecimenSqlBuilder.java
@@ -52,7 +52,7 @@ protected List resolveJoinClauses(T criteria) {
ArrayList joinClauses = new ArrayList<>();
// join to PERSON
if (criteria.age != null || (criteria.gender != null && criteria.gender.length > 0)) {
- joinClauses.add("JOIN @cdm_database_schema.PERSON P on C.person_id = P.person_id");
+ joinClauses.add("JOIN @cdm_database_schema.person P on C.person_id = P.person_id");
}
return joinClauses;
}
diff --git a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/VisitOccurrenceSqlBuilder.java b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/VisitOccurrenceSqlBuilder.java
index a366c0d5..2c733316 100644
--- a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/VisitOccurrenceSqlBuilder.java
+++ b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/VisitOccurrenceSqlBuilder.java
@@ -46,11 +46,11 @@ protected List resolveJoinClauses(T criteria) {
List joinClauses = new ArrayList<>();
if (criteria.age != null || (criteria.gender != null && criteria.gender.length > 0)) // join to PERSON
- joinClauses.add("JOIN @cdm_database_schema.PERSON P on C.person_id = P.person_id");
+ joinClauses.add("JOIN @cdm_database_schema.person P on C.person_id = P.person_id");
if ((criteria.placeOfService != null && criteria.placeOfService.length > 0) || criteria.placeOfServiceLocation != null)
- joinClauses.add("JOIN @cdm_database_schema.CARE_SITE CS on C.care_site_id = CS.care_site_id");
+ joinClauses.add("JOIN @cdm_database_schema.care_site CS on C.care_site_id = CS.care_site_id");
if (criteria.providerSpecialty != null && criteria.providerSpecialty.length > 0)
- joinClauses.add("LEFT JOIN @cdm_database_schema.PROVIDER PR on C.provider_id = PR.provider_id");
+ joinClauses.add("LEFT JOIN @cdm_database_schema.provider PR on C.provider_id = PR.provider_id");
if (criteria.placeOfServiceLocation != null) {
addFilteringByCareSiteLocationRegion(joinClauses, criteria.placeOfServiceLocation);
@@ -82,7 +82,7 @@ protected List resolveWhereClauses(T criteria, Map addit
// visitLength
if (criteria.visitLength != null) {
- whereClauses.add(BuilderUtils.buildNumericRangeClause("DATEDIFF(d,C.visit_start_date, C.visit_end_date)", criteria.visitLength));
+ whereClauses.add(BuilderUtils.buildNumericRangeClause("DATEDIFF(C.visit_end_date, C.visit_start_date)", criteria.visitLength));
}
// age
@@ -110,8 +110,8 @@ protected List resolveWhereClauses(T criteria, Map addit
protected void addFilteringByCareSiteLocationRegion(List joinClauses, Integer codesetId) {
- joinClauses.add(getLocationHistoryJoin("LH", "CARE_SITE", "C.care_site_id"));
- joinClauses.add("JOIN @cdm_database_schema.LOCATION LOC on LOC.location_id = LH.location_id");
+ joinClauses.add(getLocationHistoryJoin("LH", "care_site", "C.care_site_id"));
+ joinClauses.add("JOIN @cdm_database_schema.location LOC on LOC.location_id = LH.location_id");
joinClauses.add(
BuilderUtils.getCodesetJoinExpression(
codesetId,
@@ -124,7 +124,7 @@ protected void addFilteringByCareSiteLocationRegion(List joinClauses, In
protected String getLocationHistoryJoin(String alias, String domain, String entityIdField) {
- return "JOIN @cdm_database_schema.LOCATION_HISTORY " + alias + " " +
+ return "JOIN @cdm_database_schema.location_history " + alias + " " +
"on " + alias + ".entity_id = " + entityIdField + " " +
"AND " + alias + ".domain_id = '" + domain + "' " +
"AND C.visit_start_date >= " + alias + ".start_date " +
diff --git a/src/main/resources/resources/cohortdefinition/.DS_Store b/src/main/resources/resources/cohortdefinition/.DS_Store
new file mode 100644
index 00000000..3df1b694
Binary files /dev/null and b/src/main/resources/resources/cohortdefinition/.DS_Store differ
diff --git a/src/main/resources/resources/cohortdefinition/sql/additionalCriteria.sql b/src/main/resources/resources/cohortdefinition/sql/additionalCriteria.sql
index b0853083..db01d00c 100644
--- a/src/main/resources/resources/cohortdefinition/sql/additionalCriteria.sql
+++ b/src/main/resources/resources/cohortdefinition/sql/additionalCriteria.sql
@@ -1,5 +1,5 @@
-- Begin Correlated Criteria
@windowedCriteria
-GROUP BY p.person_id, p.event_id
+GROUP BY P.person_id, P.event_id
@occurrenceCriteria
-- End Correlated Criteria
diff --git a/src/main/resources/resources/cohortdefinition/sql/censoringInsert.sql b/src/main/resources/resources/cohortdefinition/sql/censoringInsert.sql
index f65b42f9..5bdc4596 100644
--- a/src/main/resources/resources/cohortdefinition/sql/censoringInsert.sql
+++ b/src/main/resources/resources/cohortdefinition/sql/censoringInsert.sql
@@ -1,7 +1,7 @@
-select i.event_id, i.person_id, MIN(c.start_date) as end_date
-FROM #included_events i
+select i.event_id as event_id1, i.person_id, MIN(C.start_date) as end_date
+FROM included_events i
JOIN
(
@criteriaQuery
-) C on C.person_id = I.person_id and C.start_date >= I.start_date and C.START_DATE <= I.op_end_date
+) C on C.person_id = i.person_id and C.start_date >= i.start_date and C.start_date <= i.op_end_date
GROUP BY i.event_id, i.person_id
diff --git a/src/main/resources/resources/cohortdefinition/sql/cohortInclusionAnalysis.sql b/src/main/resources/resources/cohortdefinition/sql/cohortInclusionAnalysis.sql
index 85a1d081..2c9dafcc 100644
--- a/src/main/resources/resources/cohortdefinition/sql/cohortInclusionAnalysis.sql
+++ b/src/main/resources/resources/cohortdefinition/sql/cohortInclusionAnalysis.sql
@@ -21,7 +21,7 @@ left join
(
select i.inclusion_rule_id, count_big(i.event_id) as person_count
from @eventTable Q
- JOIN #inclusion_events i on Q.person_id = I.person_id and Q.event_id = i.event_id
+ JOIN #inclusion_events i on Q.person_id = i.person_id and Q.event_id = i.event_id
group by i.inclusion_rule_id
) T on ir.rule_sequence = T.inclusion_rule_id
CROSS JOIN (select count(*) as total_rules from @results_database_schema.cohort_inclusion where @cohort_id_field_name = @target_cohort_id) RuleTotal
diff --git a/src/main/resources/resources/cohortdefinition/sql/conditionEra.sql b/src/main/resources/resources/cohortdefinition/sql/conditionEra.sql
index edafa175..05ed7c5b 100644
--- a/src/main/resources/resources/cohortdefinition/sql/conditionEra.sql
+++ b/src/main/resources/resources/cohortdefinition/sql/conditionEra.sql
@@ -1,11 +1,11 @@
-- Begin Condition Era Criteria
select C.person_id, C.condition_era_id as event_id, C.condition_era_start_date as start_date,
- C.condition_era_end_date as end_date, C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.condition_era_end_date as end_date, C.condition_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
C.condition_era_start_date as sort_date
from
(
select ce.* @ordinalExpression
- FROM @cdm_database_schema.CONDITION_ERA ce
+ FROM global_temp.condition_era ce
@codesetClause
) C
@joinClause
diff --git a/src/main/resources/resources/cohortdefinition/sql/conditionOccurrence.sql b/src/main/resources/resources/cohortdefinition/sql/conditionOccurrence.sql
index 7fd81a19..add9cccd 100644
--- a/src/main/resources/resources/cohortdefinition/sql/conditionOccurrence.sql
+++ b/src/main/resources/resources/cohortdefinition/sql/conditionOccurrence.sql
@@ -1,11 +1,11 @@
-- Begin Condition Occurrence Criteria
-SELECT C.person_id, C.condition_occurrence_id as event_id, C.condition_start_date as start_date, COALESCE(C.condition_end_date, DATEADD(day,1,C.condition_start_date)) as end_date,
- C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+SELECT C.person_id, C.condition_occurrence_id as event_id, C.condition_start_date as start_date, COALESCE(C.condition_end_date, date_add(C.condition_start_date, 1)) as end_date,
+ C.condition_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
C.condition_start_date as sort_date
FROM
(
SELECT co.* @ordinalExpression
- FROM @cdm_database_schema.CONDITION_OCCURRENCE co
+ FROM global_temp.condition_occurrence co
@codesetClause
) C
@joinClause
diff --git a/src/main/resources/resources/cohortdefinition/sql/customEraStrategy.sql b/src/main/resources/resources/cohortdefinition/sql/customEraStrategy.sql
index 513ebaa3..85e0bb36 100644
--- a/src/main/resources/resources/cohortdefinition/sql/customEraStrategy.sql
+++ b/src/main/resources/resources/cohortdefinition/sql/customEraStrategy.sql
@@ -1,65 +1,63 @@
-- custom era strategy
-with ctePersons(person_id) as (
+ctePersons as (
select distinct person_id from @eventTable
-)
-
-select person_id, drug_exposure_start_date, drug_exposure_end_date
-INTO #drugTarget
-FROM (
- select de.PERSON_ID, DRUG_EXPOSURE_START_DATE, @drugExposureEndDateExpression as DRUG_EXPOSURE_END_DATE
- FROM @cdm_database_schema.DRUG_EXPOSURE de
- JOIN ctePersons p on de.person_id = p.person_id
- JOIN #Codesets cs on cs.codeset_id = @drugCodesetId AND de.drug_concept_id = cs.concept_id
-
- UNION ALL
-
- select de.PERSON_ID, DRUG_EXPOSURE_START_DATE, @drugExposureEndDateExpression as DRUG_EXPOSURE_END_DATE
- FROM @cdm_database_schema.DRUG_EXPOSURE de
- JOIN ctePersons p on de.person_id = p.person_id
- JOIN #Codesets cs on cs.codeset_id = @drugCodesetId AND de.drug_source_concept_id = cs.concept_id
-) E
-;
-
-select et.event_id, et.person_id, ERAS.era_end_date as end_date
-INTO #strategy_ends
-from @eventTable et
-JOIN
-(
- select ENDS.person_id, min(drug_exposure_start_date) as era_start_date, DATEADD(day,@offset, ENDS.era_end_date) as era_end_date
- from
- (
- select de.person_id, de.drug_exposure_start_date, MIN(e.END_DATE) as era_end_date
- FROM #drugTarget DE
- JOIN
- (
- --cteEndDates
- select PERSON_ID, DATEADD(day,-1 * @gapDays,EVENT_DATE) as END_DATE -- unpad the end date by @gapDays
- FROM
- (
- select PERSON_ID, EVENT_DATE, EVENT_TYPE,
- MAX(START_ORDINAL) OVER (PARTITION BY PERSON_ID ORDER BY event_date, event_type ROWS UNBOUNDED PRECEDING) AS start_ordinal,
- ROW_NUMBER() OVER (PARTITION BY PERSON_ID ORDER BY EVENT_DATE, EVENT_TYPE) AS OVERALL_ORD -- this re-numbers the inner UNION so all rows are numbered ordered by the event date
- from
- (
- -- select the start dates, assigning a row number to each
- Select PERSON_ID, DRUG_EXPOSURE_START_DATE AS EVENT_DATE, 0 as EVENT_TYPE, ROW_NUMBER() OVER (PARTITION BY PERSON_ID ORDER BY DRUG_EXPOSURE_START_DATE) as START_ORDINAL
- from #drugTarget D
-
- UNION ALL
-
- -- add the end dates with NULL as the row number, padding the end dates by @gapDays to allow a grace period for overlapping ranges.
- select PERSON_ID, DATEADD(day,@gapDays,DRUG_EXPOSURE_END_DATE), 1 as EVENT_TYPE, NULL
- FROM #drugTarget D
- ) RAWDATA
- ) E
- WHERE 2 * E.START_ORDINAL - E.OVERALL_ORD = 0
- ) E on DE.PERSON_ID = E.PERSON_ID and E.END_DATE >= DE.DRUG_EXPOSURE_START_DATE
- GROUP BY de.person_id, de.drug_exposure_start_date
- ) ENDS
- GROUP BY ENDS.person_id, ENDS.era_end_date
-) ERAS on ERAS.person_id = et.person_id
-WHERE et.start_date between ERAS.era_start_date and ERAS.era_end_date;
-
-TRUNCATE TABLE #drugTarget;
-DROP TABLE #drugTarget;
+),
+
+drug_target as (
+ select person_id, drug_exposure_start_date, drug_exposure_end_date
+ FROM (
+ select de.person_id, drug_exposure_start_date, @drugExposureEndDateExpression as drug_exposure_end_date
+ FROM global_temp.drug_exposure de
+ JOIN ctePersons p on de.person_id = p.person_id
+ JOIN global_temp.codesets cs on cs.codeset_id = @drugCodesetId AND de.drug_concept_id = cs.concept_id
+
+ UNION ALL
+
+ select de.person_id, drug_exposure_start_date, @drugExposureEndDateExpression as drug_exposure_end_date
+ FROM global_temp.drug_exposure de
+ JOIN ctePersons p on de.person_id = p.person_id
+ JOIN global_temp.codesets cs on cs.codeset_id = @drugCodesetId AND de.drug_source_concept_id = cs.concept_id
+ ) E
+),
+
+strategy_ends as (
+ select et.event_id, et.person_id, ERAS.era_end_date as end_date
+ from @eventTable et
+ JOIN
+ (
+ select ENDS.person_id, min(drug_exposure_start_date) as era_start_date, date_add(ENDS.era_end_date, @offset) as era_end_date
+ from
+ (
+ select DE.person_id, DE.drug_exposure_start_date, MIN(E.end_date) as era_end_date
+ FROM drug_target DE
+ JOIN
+ (
+ --cteEndDates
+ select person_id, date_add(event_date, -1 * @gapDays) as end_date -- unpad the end date by @gapDays
+ FROM
+ (
+ select person_id, event_date, event_type,
+ MAX(start_ordinal) OVER (PARTITION BY person_id ORDER BY event_date, event_type ROWS UNBOUNDED PRECEDING) AS start_ordinal,
+ ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY event_date, event_type) AS overall_ord -- this re-numbers the inner UNION so all rows are numbered ordered by the event date
+ from
+ (
+ -- select the start dates, assigning a row number to each
+ Select person_id, drug_exposure_start_date AS event_date, 0 as event_type, ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY drug_exposure_start_date) as start_ordinal
+ from drug_target D
+
+ UNION ALL
+
+ -- add the end dates with NULL as the row number, padding the end dates by @gapDays to allow a grace period for overlapping ranges.
+ select person_id, date_add(drug_exposure_end_date, @gapDays), 1 as event_type, NULL
+ FROM drug_target D
+ ) RAWDATA
+ ) E
+ WHERE 2 * E.start_ordinal - E.overall_ord = 0
+ ) E on DE.person_id = E.person_id and E.end_date >= DE.drug_exposure_start_date
+ GROUP BY DE.person_id, DE.drug_exposure_start_date
+ ) ENDS
+ GROUP BY ENDS.person_id, ENDS.era_end_date
+ ) ERAS on ERAS.person_id = et.person_id
+ WHERE et.start_date between ERAS.era_start_date and ERAS.era_end_date
+),
diff --git a/src/main/resources/resources/cohortdefinition/sql/dateOffsetStrategy.sql b/src/main/resources/resources/cohortdefinition/sql/dateOffsetStrategy.sql
index c9fb71d3..7e043822 100644
--- a/src/main/resources/resources/cohortdefinition/sql/dateOffsetStrategy.sql
+++ b/src/main/resources/resources/cohortdefinition/sql/dateOffsetStrategy.sql
@@ -1,6 +1,7 @@
-- date offset strategy
-select event_id, person_id,
- case when DATEADD(day,@offset,@dateField) > start_date then DATEADD(day,@offset,@dateField) else start_date end as end_date
-INTO #strategy_ends
-from @eventTable;
+strategy_ends AS (
+ select event_id, person_id,
+ case when date_add(@dateField, @offset) > start_date then date_add(@dateField, @offset) else start_date end as end_date
+ from @eventTable
+),
\ No newline at end of file
diff --git a/src/main/resources/resources/cohortdefinition/sql/death.sql b/src/main/resources/resources/cohortdefinition/sql/death.sql
index 073c3496..ff7d2951 100644
--- a/src/main/resources/resources/cohortdefinition/sql/death.sql
+++ b/src/main/resources/resources/cohortdefinition/sql/death.sql
@@ -1,11 +1,11 @@
-- Begin Death Criteria
-select C.person_id, C.person_id as event_id, C.death_date as start_date, DATEADD(d,1,C.death_date) as end_date,
+select C.person_id, C.person_id as event_id, C.death_date as start_date, date_add(C.death_date, 1) as end_date,
coalesce(C.cause_concept_id,0) as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
C.death_date as sort_date
from
(
select d.*
- FROM @cdm_database_schema.DEATH d
+ FROM global_temp.death d
@codesetClause
) C
@joinClause
diff --git a/src/main/resources/resources/cohortdefinition/sql/demographicCriteria.sql b/src/main/resources/resources/cohortdefinition/sql/demographicCriteria.sql
index 465255c0..092463b6 100644
--- a/src/main/resources/resources/cohortdefinition/sql/demographicCriteria.sql
+++ b/src/main/resources/resources/cohortdefinition/sql/demographicCriteria.sql
@@ -1,7 +1,7 @@
-- Begin Demographic Criteria
-SELECT @indexId as index_id, e.person_id, e.event_id
+SELECT @indexId as index_id, E.person_id, E.event_id
FROM @eventTable E
-JOIN @cdm_database_schema.PERSON P ON P.PERSON_ID = E.PERSON_ID
+JOIN global_temp.person P ON P.person_id = E.person_id
@whereClause
-GROUP BY e.person_id, e.event_id
+GROUP BY E.person_id, E.event_id
-- End Demographic Criteria
diff --git a/src/main/resources/resources/cohortdefinition/sql/deviceExposure.sql b/src/main/resources/resources/cohortdefinition/sql/deviceExposure.sql
index a93e50d5..1073af24 100644
--- a/src/main/resources/resources/cohortdefinition/sql/deviceExposure.sql
+++ b/src/main/resources/resources/cohortdefinition/sql/deviceExposure.sql
@@ -5,7 +5,7 @@ select C.person_id, C.device_exposure_id as event_id, C.device_exposure_start_da
from
(
select de.* @ordinalExpression
- FROM @cdm_database_schema.DEVICE_EXPOSURE de
+ FROM global_temp.device_exposure de
@codesetClause
) C
@joinClause
diff --git a/src/main/resources/resources/cohortdefinition/sql/doseEra.sql b/src/main/resources/resources/cohortdefinition/sql/doseEra.sql
index 3e4e6a2f..2d2649b0 100644
--- a/src/main/resources/resources/cohortdefinition/sql/doseEra.sql
+++ b/src/main/resources/resources/cohortdefinition/sql/doseEra.sql
@@ -5,7 +5,7 @@ select C.person_id, C.dose_era_id as event_id, C.dose_era_start_date as start_da
from
(
select de.* @ordinalExpression
- FROM @cdm_database_schema.DOSE_ERA de
+ FROM global_temp.dose_era de
@codesetClause
) C
@joinClause
diff --git a/src/main/resources/resources/cohortdefinition/sql/drugEra.sql b/src/main/resources/resources/cohortdefinition/sql/drugEra.sql
index 1ad137ea..0935ecf8 100644
--- a/src/main/resources/resources/cohortdefinition/sql/drugEra.sql
+++ b/src/main/resources/resources/cohortdefinition/sql/drugEra.sql
@@ -5,7 +5,7 @@ select C.person_id, C.drug_era_id as event_id, C.drug_era_start_date as start_da
from
(
select de.* @ordinalExpression
- FROM @cdm_database_schema.DRUG_ERA de
+ FROM global_temp.drug_era de
@codesetClause
) C
@joinClause
diff --git a/src/main/resources/resources/cohortdefinition/sql/drugExposure.sql b/src/main/resources/resources/cohortdefinition/sql/drugExposure.sql
index dd2d8620..cd8331e3 100644
--- a/src/main/resources/resources/cohortdefinition/sql/drugExposure.sql
+++ b/src/main/resources/resources/cohortdefinition/sql/drugExposure.sql
@@ -1,12 +1,12 @@
-- Begin Drug Exposure Criteria
select C.person_id, C.drug_exposure_id as event_id, C.drug_exposure_start_date as start_date,
- COALESCE(C.DRUG_EXPOSURE_END_DATE, DATEADD(day,C.DAYS_SUPPLY,DRUG_EXPOSURE_START_DATE), DATEADD(day,1,C.DRUG_EXPOSURE_START_DATE)) as end_date,
+ COALESCE(C.drug_exposure_end_date, date_add(C.drug_exposure_start_date, C.days_supply), date_add(C.drug_exposure_start_date, 1)) as end_date,
C.drug_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
C.drug_exposure_start_date as sort_date
from
(
select de.* @ordinalExpression
- FROM @cdm_database_schema.DRUG_EXPOSURE de
+ FROM global_temp.drug_exposure de
@codesetClause
) C
@joinClause
diff --git a/src/main/resources/resources/cohortdefinition/sql/eraConstructor.sql b/src/main/resources/resources/cohortdefinition/sql/eraConstructor.sql
index 1d039bf7..99620248 100644
--- a/src/main/resources/resources/cohortdefinition/sql/eraConstructor.sql
+++ b/src/main/resources/resources/cohortdefinition/sql/eraConstructor.sql
@@ -1,20 +1,20 @@
-- era constructor
-WITH cteSource (@eraGroup, start_date, end_date, groupid) AS
+WITH cteSource AS
(
SELECT
@eraGroup
, start_date
, end_date
, dense_rank() over(order by @eraGroup) as groupid
- FROM #collapse_input so
+ FROM collapse_input so
)
,
--------------------------------------------------------------------------------------------------------------
-cteEndDates (groupid, end_date) AS -- the magic
+cteEndDates AS -- the magic
(
SELECT
groupid
- , DATEADD(day,-1 * @eraconstructorpad, event_date) as end_date
+ , date_add(event_date, -1 * @eraconstructorpad) as end_date
FROM
(
SELECT
@@ -38,7 +38,7 @@ cteEndDates (groupid, end_date) AS -- the magic
SELECT
groupid
- , DATEADD(day,@eraconstructorpad,end_date) as end_date
+ , date_add(end_date, @eraconstructorpad) as end_date
, 1 AS event_type
, NULL
FROM cteSource
@@ -47,7 +47,7 @@ cteEndDates (groupid, end_date) AS -- the magic
WHERE (2 * e.start_ordinal) - e.overall_ord = 0
),
--------------------------------------------------------------------------------------------------------------
-cteEnds (groupid, start_date, end_date) AS
+cteEnds AS
(
SELECT
c.groupid
@@ -58,16 +58,17 @@ cteEnds (groupid, start_date, end_date) AS
GROUP BY
c.groupid
, c.start_date
-)
-select @eraGroup, start_date, end_date
-into #collapse_output
-from
+),
+collapse_output AS
(
- select @eraGroup , min(b.start_date) as start_date, b.end_date
- from (
- select distinct @eraGroup, groupid from cteSource
- ) a
- inner join cteEnds b on a.groupid = b.groupid
- group by @eraGroup, end_date
-) q
-;
+ select @eraGroup, start_date, end_date
+ from
+ (
+ select @eraGroup , min(b.start_date) as start_date, b.end_date
+ from (
+ select distinct @eraGroup, groupid from cteSource
+ ) a
+ inner join cteEnds b on a.groupid = b.groupid
+ group by @eraGroup, end_date
+ ) q
+),
\ No newline at end of file
diff --git a/src/main/resources/resources/cohortdefinition/sql/eventTableExpression.sql b/src/main/resources/resources/cohortdefinition/sql/eventTableExpression.sql
index 2a0ce739..c059b467 100644
--- a/src/main/resources/resources/cohortdefinition/sql/eventTableExpression.sql
+++ b/src/main/resources/resources/cohortdefinition/sql/eventTableExpression.sql
@@ -1,4 +1,4 @@
-SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, op.observation_period_start_date as op_start_date, op.observation_period_end_date as op_end_date
FROM (@eventQuery) Q
-JOIN @cdm_database_schema.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
- and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+JOIN global_temp.observation_period op on Q.person_id = op.person_id
+ and op.observation_period_start_date <= Q.start_date and op.observation_period_end_date >= Q.start_date
diff --git a/src/main/resources/resources/cohortdefinition/sql/generateCohort.sql b/src/main/resources/resources/cohortdefinition/sql/generateCohort.sql
index 33454cff..f267b074 100644
--- a/src/main/resources/resources/cohortdefinition/sql/generateCohort.sql
+++ b/src/main/resources/resources/cohortdefinition/sql/generateCohort.sql
@@ -1,72 +1,74 @@
-@codesetQuery
-
-with primary_events (event_id, person_id, start_date, end_date, op_start_date, op_end_date, visit_occurrence_id) as
+with primary_events as
(
@primaryEventsQuery
-)
-SELECT event_id, person_id, start_date, end_date, op_start_date, op_end_date, visit_occurrence_id
-INTO #qualified_events
-FROM
-(
- select pe.event_id, pe.person_id, pe.start_date, pe.end_date, pe.op_start_date, pe.op_end_date, row_number() over (partition by pe.person_id order by pe.start_date @QualifiedEventSort) as ordinal, cast(pe.visit_occurrence_id as bigint) as visit_occurrence_id
- FROM primary_events pe
- @additionalCriteriaQuery
-) QE
-@QualifiedLimitFilter
-;
+),
+qualified_events AS (
+ SELECT event_id, person_id, start_date, end_date, op_start_date, op_end_date, visit_occurrence_id
+ FROM
+ (
+ select pe.event_id, pe.person_id, pe.start_date, pe.end_date, pe.op_start_date, pe.op_end_date, row_number() over (partition by pe.person_id order by pe.start_date @QualifiedEventSort) as ordinal, cast(pe.visit_occurrence_id as bigint) as visit_occurrence_id
+ FROM primary_events pe
+ @additionalCriteriaQuery
+ ) QE
+ @QualifiedLimitFilter
+),
--- Inclusion Rule Inserts
@inclusionCohortInserts
-with cteIncludedEvents(event_id, person_id, start_date, end_date, op_start_date, op_end_date, ordinal) as
+cteIncludedEvents as
(
SELECT event_id, person_id, start_date, end_date, op_start_date, op_end_date, row_number() over (partition by person_id order by start_date @IncludedEventSort) as ordinal
from
(
select Q.event_id, Q.person_id, Q.start_date, Q.end_date, Q.op_start_date, Q.op_end_date, SUM(coalesce(POWER(cast(2 as bigint), I.inclusion_rule_id), 0)) as inclusion_rule_mask
- from #qualified_events Q
- LEFT JOIN #inclusion_events I on I.person_id = Q.person_id and I.event_id = Q.event_id
+ from qualified_events Q
+ LEFT JOIN inclusion_events I on I.person_id = Q.person_id and I.event_id = Q.event_id
GROUP BY Q.event_id, Q.person_id, Q.start_date, Q.end_date, Q.op_start_date, Q.op_end_date
) MG -- matching groups
{@ruleTotal != 0}?{
-- the matching group with all bits set ( POWER(2,# of inclusion rules) - 1 = inclusion_rule_mask
WHERE (MG.inclusion_rule_mask = POWER(cast(2 as bigint),@ruleTotal)-1)
}
-)
-select event_id, person_id, start_date, end_date, op_start_date, op_end_date
-into #included_events
-FROM cteIncludedEvents Results
-@ResultLimitFilter
-;
+),
+
+included_events AS (
+ select event_id, person_id, start_date, end_date, op_start_date, op_end_date
+ FROM cteIncludedEvents Results
+ @ResultLimitFilter
+),
@strategy_ends_temp_tables
-- generate cohort periods into #final_cohort
-with cohort_ends (event_id, person_id, end_date) as
+cohort_ends as
(
-- cohort exit dates
@cohort_end_unions
),
-first_ends (person_id, start_date, end_date) as
+
+first_ends as
(
select F.person_id, F.start_date, F.end_date
FROM (
select I.event_id, I.person_id, I.start_date, E.end_date, row_number() over (partition by I.person_id, I.event_id order by E.end_date) as ordinal
- from #included_events I
- join cohort_ends E on I.event_id = E.event_id and I.person_id = E.person_id and E.end_date >= I.start_date
+ from included_events I
+ join cohort_ends E on I.event_id = E.event_id1 and I.person_id = E.person_id and E.end_date >= I.start_date
) F
WHERE F.ordinal = 1
-)
-select person_id, start_date, end_date
-INTO #cohort_rows
-from first_ends;
+),
+
+cohort_rows AS (
+ select person_id, start_date, end_date
+ from first_ends
+),
-with cteEndDates (person_id, end_date) AS -- the magic
+cteEndDates AS -- the magic
(
SELECT
person_id
- , DATEADD(day,-1 * @eraconstructorpad, event_date) as end_date
+ , date_add(event_date, -1 * @eraconstructorpad) as end_date
FROM
(
SELECT
@@ -82,41 +84,39 @@ with cteEndDates (person_id, end_date) AS -- the magic
, start_date AS event_date
, -1 AS event_type
, ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY start_date) AS start_ordinal
- FROM #cohort_rows
+ FROM cohort_rows
UNION ALL
SELECT
person_id
- , DATEADD(day,@eraconstructorpad,end_date) as end_date
+ , date_add(end_date, @eraconstructorpad) as end_date
, 1 AS event_type
, NULL
- FROM #cohort_rows
+ FROM cohort_rows
) RAWDATA
) e
WHERE (2 * e.start_ordinal) - e.overall_ord = 0
),
-cteEnds (person_id, start_date, end_date) AS
+cteEnds AS
(
SELECT
c.person_id
, c.start_date
, MIN(e.end_date) AS end_date
- FROM #cohort_rows c
+ FROM cohort_rows c
JOIN cteEndDates e ON c.person_id = e.person_id AND e.end_date >= c.start_date
GROUP BY c.person_id, c.start_date
+),
+final_cohort AS (
+ select person_id, min(start_date) as start_date, end_date
+ from cteEnds
+ group by person_id, end_date
)
-select person_id, min(start_date) as start_date, end_date
-into #final_cohort
-from cteEnds
-group by person_id, end_date
-;
-DELETE FROM @target_database_schema.@target_cohort_table where @cohort_id_field_name = @target_cohort_id;
-INSERT INTO @target_database_schema.@target_cohort_table (@cohort_id_field_name, subject_id, cohort_start_date, cohort_end_date)
@finalCohortQuery
-;
+
{@generateStats != 0}?{
-- Find the event that is the 'best match' per person.
@@ -160,22 +160,4 @@ DROP TABLE #best_events;
}
-@strategy_ends_cleanup
-
-TRUNCATE TABLE #cohort_rows;
-DROP TABLE #cohort_rows;
-
-TRUNCATE TABLE #final_cohort;
-DROP TABLE #final_cohort;
-
-TRUNCATE TABLE #inclusion_events;
-DROP TABLE #inclusion_events;
-
-TRUNCATE TABLE #qualified_events;
-DROP TABLE #qualified_events;
-
-TRUNCATE TABLE #included_events;
-DROP TABLE #included_events;
-TRUNCATE TABLE #Codesets;
-DROP TABLE #Codesets;
diff --git a/src/main/resources/resources/cohortdefinition/sql/inclusionrule.sql b/src/main/resources/resources/cohortdefinition/sql/inclusionrule.sql
index bee0cb9b..aca73475 100644
--- a/src/main/resources/resources/cohortdefinition/sql/inclusionrule.sql
+++ b/src/main/resources/resources/cohortdefinition/sql/inclusionrule.sql
@@ -1,9 +1,9 @@
-select @inclusion_rule_id as inclusion_rule_id, person_id, event_id
-INTO #Inclusion_@inclusion_rule_id
-FROM
-(
- select pe.person_id, pe.event_id
- FROM #qualified_events pe
- @additionalCriteriaQuery
-) Results
-;
+Inclusion_@inclusion_rule_id AS (
+ select @inclusion_rule_id as inclusion_rule_id, person_id, event_id
+ FROM
+ (
+ select pe.person_id, pe.event_id
+ FROM qualified_events pe
+ @additionalCriteriaQuery
+ ) Results
+),
\ No newline at end of file
diff --git a/src/main/resources/resources/cohortdefinition/sql/locationRegion.sql b/src/main/resources/resources/cohortdefinition/sql/locationRegion.sql
index edcfa718..6d4f8eea 100644
--- a/src/main/resources/resources/cohortdefinition/sql/locationRegion.sql
+++ b/src/main/resources/resources/cohortdefinition/sql/locationRegion.sql
@@ -10,8 +10,8 @@ select
from
(
select l.*, lh.*
- FROM @cdm_database_schema.LOCATION l
- JOIN @cdm_database_schema.LOCATION_HISTORY lh ON l.location_id = lh.location_id
+ FROM global_temp.location l
+ JOIN global_temp.location_history lh ON l.location_id = lh.location_id
@codesetClause
WHERE lh.domain_id = 'PERSON'
) C
diff --git a/src/main/resources/resources/cohortdefinition/sql/measurement.sql b/src/main/resources/resources/cohortdefinition/sql/measurement.sql
index 06368e14..dbfeedb1 100644
--- a/src/main/resources/resources/cohortdefinition/sql/measurement.sql
+++ b/src/main/resources/resources/cohortdefinition/sql/measurement.sql
@@ -1,11 +1,11 @@
-- Begin Measurement Criteria
-select C.person_id, C.measurement_id as event_id, C.measurement_date as start_date, DATEADD(d,1,C.measurement_date) as END_DATE,
+select C.person_id, C.measurement_id as event_id, C.measurement_date as start_date, date_add(C.measurement_date, 1) as end_date,
C.measurement_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
C.measurement_date as sort_date
from
(
select m.* @ordinalExpression
- FROM @cdm_database_schema.MEASUREMENT m
+ FROM global_temp.measurement m
@codesetClause
) C
@joinClause
diff --git a/src/main/resources/resources/cohortdefinition/sql/observation.sql b/src/main/resources/resources/cohortdefinition/sql/observation.sql
index ff45bce4..06de2b3b 100644
--- a/src/main/resources/resources/cohortdefinition/sql/observation.sql
+++ b/src/main/resources/resources/cohortdefinition/sql/observation.sql
@@ -1,11 +1,11 @@
-- Begin Observation Criteria
-select C.person_id, C.observation_id as event_id, C.observation_date as start_date, DATEADD(d,1,C.observation_date) as END_DATE,
+select C.person_id, C.observation_id as event_id, C.observation_date as start_date, date_add(C.observation_date, 1) as end_date,
C.observation_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
C.observation_date as sort_date
from
(
select o.* @ordinalExpression
- FROM @cdm_database_schema.OBSERVATION o
+ FROM global_temp.observation o
@codesetClause
) C
@joinClause
diff --git a/src/main/resources/resources/cohortdefinition/sql/observationPeriod.sql b/src/main/resources/resources/cohortdefinition/sql/observationPeriod.sql
index 15f3a192..e147eb53 100644
--- a/src/main/resources/resources/cohortdefinition/sql/observationPeriod.sql
+++ b/src/main/resources/resources/cohortdefinition/sql/observationPeriod.sql
@@ -6,7 +6,7 @@ select C.person_id, C.observation_period_id as event_id, @startDateExpression as
from
(
select op.*, row_number() over (PARTITION BY op.person_id ORDER BY op.observation_period_start_date) as ordinal
- FROM @cdm_database_schema.OBSERVATION_PERIOD op
+ FROM global_temp.observation_period op
) C
@joinClause
@whereClause
diff --git a/src/main/resources/resources/cohortdefinition/sql/payerPlanPeriod.sql b/src/main/resources/resources/cohortdefinition/sql/payerPlanPeriod.sql
index d6b06403..880d99e4 100644
--- a/src/main/resources/resources/cohortdefinition/sql/payerPlanPeriod.sql
+++ b/src/main/resources/resources/cohortdefinition/sql/payerPlanPeriod.sql
@@ -6,7 +6,7 @@ select C.person_id, C.payer_plan_period_id as event_id, @startDateExpression as
from
(
select ppp.*, row_number() over (PARTITION BY ppp.person_id ORDER BY ppp.payer_plan_period_start_date) as ordinal
- FROM @cdm_database_schema.PAYER_PLAN_PERIOD ppp
+ FROM global_temp.payer_plan_period ppp
) C
@joinClause
@whereClause
diff --git a/src/main/resources/resources/cohortdefinition/sql/primaryEventsQuery.sql b/src/main/resources/resources/cohortdefinition/sql/primaryEventsQuery.sql
index 534f24f5..3c3439bb 100644
--- a/src/main/resources/resources/cohortdefinition/sql/primaryEventsQuery.sql
+++ b/src/main/resources/resources/cohortdefinition/sql/primaryEventsQuery.sql
@@ -4,12 +4,12 @@ FROM
(
select E.person_id, E.start_date, E.end_date,
row_number() OVER (PARTITION BY E.person_id ORDER BY E.sort_date @EventSort) ordinal,
- OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date, cast(E.visit_occurrence_id as bigint) as visit_occurrence_id
+ op.observation_period_start_date as op_start_date, op.observation_period_end_date as op_end_date, cast(E.visit_occurrence_id as bigint) as visit_occurrence_id
FROM
(
@criteriaQueries
) E
- JOIN @cdm_database_schema.observation_period OP on E.person_id = OP.person_id and E.start_date >= OP.observation_period_start_date and E.start_date <= op.observation_period_end_date
+ JOIN global_temp.observation_period op on E.person_id = op.person_id and E.start_date >= op.observation_period_start_date and E.start_date <= op.observation_period_end_date
WHERE @primaryEventsFilter
) P
@primaryEventLimit
diff --git a/src/main/resources/resources/cohortdefinition/sql/procedureOccurrence.sql b/src/main/resources/resources/cohortdefinition/sql/procedureOccurrence.sql
index cd377d01..86710530 100644
--- a/src/main/resources/resources/cohortdefinition/sql/procedureOccurrence.sql
+++ b/src/main/resources/resources/cohortdefinition/sql/procedureOccurrence.sql
@@ -1,11 +1,11 @@
-- Begin Procedure Occurrence Criteria
-select C.person_id, C.procedure_occurrence_id as event_id, C.procedure_date as start_date, DATEADD(d,1,C.procedure_date) as END_DATE,
+select C.person_id, C.procedure_occurrence_id as event_id, C.procedure_date as start_date, date_add(C.procedure_date, 1) as end_date,
C.procedure_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
C.procedure_date as sort_date
from
(
select po.* @ordinalExpression
- FROM @cdm_database_schema.PROCEDURE_OCCURRENCE po
+ FROM global_temp.procedure_occurrence po
@codesetClause
) C
@joinClause
diff --git a/src/main/resources/resources/cohortdefinition/sql/specimen.sql b/src/main/resources/resources/cohortdefinition/sql/specimen.sql
index 1f1eefbb..61c1dc96 100644
--- a/src/main/resources/resources/cohortdefinition/sql/specimen.sql
+++ b/src/main/resources/resources/cohortdefinition/sql/specimen.sql
@@ -1,11 +1,11 @@
-- Begin Specimen Criteria
-select C.person_id, C.specimen_id as event_id, C.specimen_date as start_date, DATEADD(d,1,C.specimen_date) as end_date,
+select C.person_id, C.specimen_id as event_id, C.specimen_date as start_date, date_add(C.specimen_date, 1) as end_date,
C.specimen_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
C.specimen_date as sort_date
from
(
select s.* @ordinalExpression
- FROM @cdm_database_schema.SPECIMEN s
+ FROM global_temp.specimen s
@codesetClause
) C
@joinClause
diff --git a/src/main/resources/resources/cohortdefinition/sql/visitOccurrence.sql b/src/main/resources/resources/cohortdefinition/sql/visitOccurrence.sql
index 8a242681..4c89a08f 100644
--- a/src/main/resources/resources/cohortdefinition/sql/visitOccurrence.sql
+++ b/src/main/resources/resources/cohortdefinition/sql/visitOccurrence.sql
@@ -5,7 +5,7 @@ select C.person_id, C.visit_occurrence_id as event_id, C.visit_start_date as sta
from
(
select vo.* @ordinalExpression
- FROM @cdm_database_schema.VISIT_OCCURRENCE vo
+ FROM global_temp.visit_occurrence vo
@codesetClause
) C
@joinClause
diff --git a/src/main/resources/resources/cohortdefinition/sql/windowedCriteria.sql b/src/main/resources/resources/cohortdefinition/sql/windowedCriteria.sql
index a61e55d6..e8284aff 100644
--- a/src/main/resources/resources/cohortdefinition/sql/windowedCriteria.sql
+++ b/src/main/resources/resources/cohortdefinition/sql/windowedCriteria.sql
@@ -1,4 +1,4 @@
-SELECT @indexId as index_id, p.person_id, p.event_id
+SELECT @indexId as index_id, P.person_id, P.event_id
FROM @eventTable P
@joinType JOIN
(
diff --git a/src/main/resources/resources/cohortdefinition/sql_server/additionalCriteria.sql b/src/main/resources/resources/cohortdefinition/sql_server/additionalCriteria.sql
new file mode 100644
index 00000000..b0853083
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_server/additionalCriteria.sql
@@ -0,0 +1,5 @@
+-- Begin Correlated Criteria
+@windowedCriteria
+GROUP BY p.person_id, p.event_id
+@occurrenceCriteria
+-- End Correlated Criteria
diff --git a/src/main/resources/resources/cohortdefinition/sql_server/censoringInsert.sql b/src/main/resources/resources/cohortdefinition/sql_server/censoringInsert.sql
new file mode 100644
index 00000000..f65b42f9
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_server/censoringInsert.sql
@@ -0,0 +1,7 @@
+select i.event_id, i.person_id, MIN(c.start_date) as end_date
+FROM #included_events i
+JOIN
+(
+@criteriaQuery
+) C on C.person_id = I.person_id and C.start_date >= I.start_date and C.START_DATE <= I.op_end_date
+GROUP BY i.event_id, i.person_id
diff --git a/src/main/resources/resources/cohortdefinition/sql_server/codesetQuery.sql b/src/main/resources/resources/cohortdefinition/sql_server/codesetQuery.sql
new file mode 100644
index 00000000..ebc1008d
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_server/codesetQuery.sql
@@ -0,0 +1,7 @@
+CREATE TABLE #Codesets (
+ codeset_id int NOT NULL,
+ concept_id bigint NOT NULL
+)
+;
+
+@codesetInserts
diff --git a/src/main/resources/resources/cohortdefinition/sql_server/cohortCensoredStats.sql b/src/main/resources/resources/cohortdefinition/sql_server/cohortCensoredStats.sql
new file mode 100644
index 00000000..8d9f9710
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_server/cohortCensoredStats.sql
@@ -0,0 +1,7 @@
+-- calculate censored
+delete from @results_database_schema.cohort_censor_stats where @cohort_id_field_name = @target_cohort_id;
+insert into @results_database_schema.cohort_censor_stats (@cohort_id_field_name, lost_count)
+ select @target_cohort_id as @cohort_id_field_name, coalesce(FCC.total_people - TC.total, 0) as lost_count
+ FROM
+ (select count_big(distinct person_id) as total_people from #final_cohort) FCC,
+ (select count_big(distinct subject_id) as total from @target_database_schema.@target_cohort_table t where t.@cohort_id_field_name = @target_cohort_id) TC;
\ No newline at end of file
diff --git a/src/main/resources/resources/cohortdefinition/sql_server/cohortInclusionAnalysis.sql b/src/main/resources/resources/cohortdefinition/sql_server/cohortInclusionAnalysis.sql
new file mode 100644
index 00000000..85a1d081
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_server/cohortInclusionAnalysis.sql
@@ -0,0 +1,44 @@
+-- calculte matching group counts
+delete from @results_database_schema.cohort_inclusion_result where @cohort_id_field_name = @target_cohort_id and mode_id = @inclusionImpactMode;
+insert into @results_database_schema.cohort_inclusion_result (@cohort_id_field_name, inclusion_rule_mask, person_count, mode_id)
+select @target_cohort_id as @cohort_id_field_name, inclusion_rule_mask, count_big(*) as person_count, @inclusionImpactMode as mode_id
+from
+(
+ select Q.person_id, Q.event_id, CAST(SUM(coalesce(POWER(cast(2 as bigint), I.inclusion_rule_id), 0)) AS bigint) as inclusion_rule_mask
+ from @eventTable Q
+ LEFT JOIN #inclusion_events I on q.person_id = i.person_id and q.event_id = i.event_id
+ GROUP BY Q.person_id, Q.event_id
+) MG -- matching groups
+group by inclusion_rule_mask
+;
+
+-- calculate gain counts
+delete from @results_database_schema.cohort_inclusion_stats where @cohort_id_field_name = @target_cohort_id and mode_id = @inclusionImpactMode;
+insert into @results_database_schema.cohort_inclusion_stats (@cohort_id_field_name, rule_sequence, person_count, gain_count, person_total, mode_id)
+select ir.@cohort_id_field_name, ir.rule_sequence, coalesce(T.person_count, 0) as person_count, coalesce(SR.person_count, 0) gain_count, EventTotal.total, @inclusionImpactMode as mode_id
+from @results_database_schema.cohort_inclusion ir
+left join
+(
+ select i.inclusion_rule_id, count_big(i.event_id) as person_count
+ from @eventTable Q
+ JOIN #inclusion_events i on Q.person_id = I.person_id and Q.event_id = i.event_id
+ group by i.inclusion_rule_id
+) T on ir.rule_sequence = T.inclusion_rule_id
+CROSS JOIN (select count(*) as total_rules from @results_database_schema.cohort_inclusion where @cohort_id_field_name = @target_cohort_id) RuleTotal
+CROSS JOIN (select count_big(event_id) as total from @eventTable) EventTotal
+LEFT JOIN @results_database_schema.cohort_inclusion_result SR on SR.mode_id = @inclusionImpactMode AND SR.@cohort_id_field_name = @target_cohort_id AND (POWER(cast(2 as bigint),RuleTotal.total_rules) - POWER(cast(2 as bigint),ir.rule_sequence) - 1) = SR.inclusion_rule_mask -- POWER(2,rule count) - POWER(2,rule sequence) - 1 is the mask for 'all except this rule'
+WHERE ir.@cohort_id_field_name = @target_cohort_id
+;
+
+-- calculate totals
+delete from @results_database_schema.cohort_summary_stats where @cohort_id_field_name = @target_cohort_id and mode_id = @inclusionImpactMode;
+insert into @results_database_schema.cohort_summary_stats (@cohort_id_field_name, base_count, final_count, mode_id)
+select @target_cohort_id as @cohort_id_field_name, PC.total as person_count, coalesce(FC.total, 0) as final_count, @inclusionImpactMode as mode_id
+FROM
+(select count_big(event_id) as total from @eventTable) PC,
+(select sum(sr.person_count) as total
+ from @results_database_schema.cohort_inclusion_result sr
+ CROSS JOIN (select count(*) as total_rules from @results_database_schema.cohort_inclusion where @cohort_id_field_name = @target_cohort_id) RuleTotal
+ where sr.mode_id = @inclusionImpactMode and sr.@cohort_id_field_name = @target_cohort_id and sr.inclusion_rule_mask = POWER(cast(2 as bigint),RuleTotal.total_rules)-1
+) FC
+;
diff --git a/src/main/resources/resources/cohortdefinition/sql_server/conditionEra.sql b/src/main/resources/resources/cohortdefinition/sql_server/conditionEra.sql
new file mode 100644
index 00000000..edafa175
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_server/conditionEra.sql
@@ -0,0 +1,13 @@
+-- Begin Condition Era Criteria
+select C.person_id, C.condition_era_id as event_id, C.condition_era_start_date as start_date,
+ C.condition_era_end_date as end_date, C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.condition_era_start_date as sort_date
+from
+(
+ select ce.* @ordinalExpression
+ FROM @cdm_database_schema.CONDITION_ERA ce
+@codesetClause
+) C
+@joinClause
+@whereClause
+-- End Condition Era Criteria
diff --git a/src/main/resources/resources/cohortdefinition/sql_server/conditionOccurrence.sql b/src/main/resources/resources/cohortdefinition/sql_server/conditionOccurrence.sql
new file mode 100644
index 00000000..7fd81a19
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_server/conditionOccurrence.sql
@@ -0,0 +1,13 @@
+-- Begin Condition Occurrence Criteria
+SELECT C.person_id, C.condition_occurrence_id as event_id, C.condition_start_date as start_date, COALESCE(C.condition_end_date, DATEADD(day,1,C.condition_start_date)) as end_date,
+ C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.condition_start_date as sort_date
+FROM
+(
+ SELECT co.* @ordinalExpression
+ FROM @cdm_database_schema.CONDITION_OCCURRENCE co
+ @codesetClause
+) C
+@joinClause
+@whereClause
+-- End Condition Occurrence Criteria
diff --git a/src/main/resources/resources/cohortdefinition/sql_server/customEraStrategy.sql b/src/main/resources/resources/cohortdefinition/sql_server/customEraStrategy.sql
new file mode 100644
index 00000000..513ebaa3
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_server/customEraStrategy.sql
@@ -0,0 +1,65 @@
+-- custom era strategy
+
+with ctePersons(person_id) as (
+ select distinct person_id from @eventTable
+)
+
+select person_id, drug_exposure_start_date, drug_exposure_end_date
+INTO #drugTarget
+FROM (
+ select de.PERSON_ID, DRUG_EXPOSURE_START_DATE, @drugExposureEndDateExpression as DRUG_EXPOSURE_END_DATE
+ FROM @cdm_database_schema.DRUG_EXPOSURE de
+ JOIN ctePersons p on de.person_id = p.person_id
+ JOIN #Codesets cs on cs.codeset_id = @drugCodesetId AND de.drug_concept_id = cs.concept_id
+
+ UNION ALL
+
+ select de.PERSON_ID, DRUG_EXPOSURE_START_DATE, @drugExposureEndDateExpression as DRUG_EXPOSURE_END_DATE
+ FROM @cdm_database_schema.DRUG_EXPOSURE de
+ JOIN ctePersons p on de.person_id = p.person_id
+ JOIN #Codesets cs on cs.codeset_id = @drugCodesetId AND de.drug_source_concept_id = cs.concept_id
+) E
+;
+
+select et.event_id, et.person_id, ERAS.era_end_date as end_date
+INTO #strategy_ends
+from @eventTable et
+JOIN
+(
+ select ENDS.person_id, min(drug_exposure_start_date) as era_start_date, DATEADD(day,@offset, ENDS.era_end_date) as era_end_date
+ from
+ (
+ select de.person_id, de.drug_exposure_start_date, MIN(e.END_DATE) as era_end_date
+ FROM #drugTarget DE
+ JOIN
+ (
+ --cteEndDates
+ select PERSON_ID, DATEADD(day,-1 * @gapDays,EVENT_DATE) as END_DATE -- unpad the end date by @gapDays
+ FROM
+ (
+ select PERSON_ID, EVENT_DATE, EVENT_TYPE,
+ MAX(START_ORDINAL) OVER (PARTITION BY PERSON_ID ORDER BY event_date, event_type ROWS UNBOUNDED PRECEDING) AS start_ordinal,
+ ROW_NUMBER() OVER (PARTITION BY PERSON_ID ORDER BY EVENT_DATE, EVENT_TYPE) AS OVERALL_ORD -- this re-numbers the inner UNION so all rows are numbered ordered by the event date
+ from
+ (
+ -- select the start dates, assigning a row number to each
+ Select PERSON_ID, DRUG_EXPOSURE_START_DATE AS EVENT_DATE, 0 as EVENT_TYPE, ROW_NUMBER() OVER (PARTITION BY PERSON_ID ORDER BY DRUG_EXPOSURE_START_DATE) as START_ORDINAL
+ from #drugTarget D
+
+ UNION ALL
+
+ -- add the end dates with NULL as the row number, padding the end dates by @gapDays to allow a grace period for overlapping ranges.
+ select PERSON_ID, DATEADD(day,@gapDays,DRUG_EXPOSURE_END_DATE), 1 as EVENT_TYPE, NULL
+ FROM #drugTarget D
+ ) RAWDATA
+ ) E
+ WHERE 2 * E.START_ORDINAL - E.OVERALL_ORD = 0
+ ) E on DE.PERSON_ID = E.PERSON_ID and E.END_DATE >= DE.DRUG_EXPOSURE_START_DATE
+ GROUP BY de.person_id, de.drug_exposure_start_date
+ ) ENDS
+ GROUP BY ENDS.person_id, ENDS.era_end_date
+) ERAS on ERAS.person_id = et.person_id
+WHERE et.start_date between ERAS.era_start_date and ERAS.era_end_date;
+
+TRUNCATE TABLE #drugTarget;
+DROP TABLE #drugTarget;
diff --git a/src/main/resources/resources/cohortdefinition/sql_server/dateOffsetStrategy.sql b/src/main/resources/resources/cohortdefinition/sql_server/dateOffsetStrategy.sql
new file mode 100644
index 00000000..c9fb71d3
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_server/dateOffsetStrategy.sql
@@ -0,0 +1,6 @@
+-- date offset strategy
+
+select event_id, person_id,
+ case when DATEADD(day,@offset,@dateField) > start_date then DATEADD(day,@offset,@dateField) else start_date end as end_date
+INTO #strategy_ends
+from @eventTable;
diff --git a/src/main/resources/resources/cohortdefinition/sql_server/death.sql b/src/main/resources/resources/cohortdefinition/sql_server/death.sql
new file mode 100644
index 00000000..073c3496
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_server/death.sql
@@ -0,0 +1,14 @@
+-- Begin Death Criteria
+select C.person_id, C.person_id as event_id, C.death_date as start_date, DATEADD(d,1,C.death_date) as end_date,
+ coalesce(C.cause_concept_id,0) as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.death_date as sort_date
+from
+(
+ select d.*
+ FROM @cdm_database_schema.DEATH d
+@codesetClause
+) C
+@joinClause
+@whereClause
+-- End Death Criteria
+
diff --git a/src/main/resources/resources/cohortdefinition/sql_server/demographicCriteria.sql b/src/main/resources/resources/cohortdefinition/sql_server/demographicCriteria.sql
new file mode 100644
index 00000000..465255c0
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_server/demographicCriteria.sql
@@ -0,0 +1,7 @@
+-- Begin Demographic Criteria
+SELECT @indexId as index_id, e.person_id, e.event_id
+FROM @eventTable E
+JOIN @cdm_database_schema.PERSON P ON P.PERSON_ID = E.PERSON_ID
+@whereClause
+GROUP BY e.person_id, e.event_id
+-- End Demographic Criteria
diff --git a/src/main/resources/resources/cohortdefinition/sql_server/deviceExposure.sql b/src/main/resources/resources/cohortdefinition/sql_server/deviceExposure.sql
new file mode 100644
index 00000000..a93e50d5
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_server/deviceExposure.sql
@@ -0,0 +1,13 @@
+-- Begin Device Exposure Criteria
+select C.person_id, C.device_exposure_id as event_id, C.device_exposure_start_date as start_date, C.device_exposure_end_date as end_date,
+ C.device_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.device_exposure_start_date as sort_date
+from
+(
+ select de.* @ordinalExpression
+ FROM @cdm_database_schema.DEVICE_EXPOSURE de
+@codesetClause
+) C
+@joinClause
+@whereClause
+-- End Device Exposure Criteria
diff --git a/src/main/resources/resources/cohortdefinition/sql_server/doseEra.sql b/src/main/resources/resources/cohortdefinition/sql_server/doseEra.sql
new file mode 100644
index 00000000..3e4e6a2f
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_server/doseEra.sql
@@ -0,0 +1,13 @@
+-- Begin Dose Era Criteria
+select C.person_id, C.dose_era_id as event_id, C.dose_era_start_date as start_date, C.dose_era_end_date as end_date,
+ C.drug_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.dose_era_start_date as sort_date
+from
+(
+ select de.* @ordinalExpression
+ FROM @cdm_database_schema.DOSE_ERA de
+@codesetClause
+) C
+@joinClause
+@whereClause
+-- End Dose Era Criteria
diff --git a/src/main/resources/resources/cohortdefinition/sql_server/drugEra.sql b/src/main/resources/resources/cohortdefinition/sql_server/drugEra.sql
new file mode 100644
index 00000000..1ad137ea
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_server/drugEra.sql
@@ -0,0 +1,13 @@
+-- Begin Drug Era Criteria
+select C.person_id, C.drug_era_id as event_id, C.drug_era_start_date as start_date, C.drug_era_end_date as end_date,
+ C.drug_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.drug_era_start_date as sort_date
+from
+(
+ select de.* @ordinalExpression
+ FROM @cdm_database_schema.DRUG_ERA de
+@codesetClause
+) C
+@joinClause
+@whereClause
+-- End Drug Era Criteria
diff --git a/src/main/resources/resources/cohortdefinition/sql_server/drugExposure.sql b/src/main/resources/resources/cohortdefinition/sql_server/drugExposure.sql
new file mode 100644
index 00000000..dd2d8620
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_server/drugExposure.sql
@@ -0,0 +1,14 @@
+-- Begin Drug Exposure Criteria
+select C.person_id, C.drug_exposure_id as event_id, C.drug_exposure_start_date as start_date,
+ COALESCE(C.DRUG_EXPOSURE_END_DATE, DATEADD(day,C.DAYS_SUPPLY,DRUG_EXPOSURE_START_DATE), DATEADD(day,1,C.DRUG_EXPOSURE_START_DATE)) as end_date,
+ C.drug_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.drug_exposure_start_date as sort_date
+from
+(
+ select de.* @ordinalExpression
+ FROM @cdm_database_schema.DRUG_EXPOSURE de
+@codesetClause
+) C
+@joinClause
+@whereClause
+-- End Drug Exposure Criteria
diff --git a/src/main/resources/resources/cohortdefinition/sql_server/eraConstructor.sql b/src/main/resources/resources/cohortdefinition/sql_server/eraConstructor.sql
new file mode 100644
index 00000000..1d039bf7
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_server/eraConstructor.sql
@@ -0,0 +1,73 @@
+-- era constructor
+WITH cteSource (@eraGroup, start_date, end_date, groupid) AS
+(
+ SELECT
+ @eraGroup
+ , start_date
+ , end_date
+ , dense_rank() over(order by @eraGroup) as groupid
+ FROM #collapse_input so
+)
+,
+--------------------------------------------------------------------------------------------------------------
+cteEndDates (groupid, end_date) AS -- the magic
+(
+ SELECT
+ groupid
+ , DATEADD(day,-1 * @eraconstructorpad, event_date) as end_date
+ FROM
+ (
+ SELECT
+ groupid
+ , event_date
+ , event_type
+ , MAX(start_ordinal) OVER (PARTITION BY groupid ORDER BY event_date, event_type ROWS UNBOUNDED PRECEDING) AS start_ordinal
+ , ROW_NUMBER() OVER (PARTITION BY groupid ORDER BY event_date, event_type) AS overall_ord
+ FROM
+ (
+
+ SELECT
+ groupid
+ , start_date AS event_date
+ , -1 AS event_type
+ , ROW_NUMBER() OVER (PARTITION BY groupid ORDER BY start_date) AS start_ordinal
+ FROM cteSource
+
+ UNION ALL
+
+
+ SELECT
+ groupid
+ , DATEADD(day,@eraconstructorpad,end_date) as end_date
+ , 1 AS event_type
+ , NULL
+ FROM cteSource
+ ) RAWDATA
+ ) e
+ WHERE (2 * e.start_ordinal) - e.overall_ord = 0
+),
+--------------------------------------------------------------------------------------------------------------
+cteEnds (groupid, start_date, end_date) AS
+(
+ SELECT
+ c.groupid
+ , c.start_date
+ , MIN(e.end_date) AS era_end_date
+ FROM cteSource c
+ JOIN cteEndDates e ON c.groupid = e.groupid AND e.end_date >= c.start_date
+ GROUP BY
+ c.groupid
+ , c.start_date
+)
+select @eraGroup, start_date, end_date
+into #collapse_output
+from
+(
+ select @eraGroup , min(b.start_date) as start_date, b.end_date
+ from (
+ select distinct @eraGroup, groupid from cteSource
+ ) a
+ inner join cteEnds b on a.groupid = b.groupid
+ group by @eraGroup, end_date
+) q
+;
diff --git a/src/main/resources/resources/cohortdefinition/sql_server/eventTableExpression.sql b/src/main/resources/resources/cohortdefinition/sql_server/eventTableExpression.sql
new file mode 100644
index 00000000..2a0ce739
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_server/eventTableExpression.sql
@@ -0,0 +1,4 @@
+SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (@eventQuery) Q
+JOIN @cdm_database_schema.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
diff --git a/src/main/resources/resources/cohortdefinition/sql_server/generateCohort.sql b/src/main/resources/resources/cohortdefinition/sql_server/generateCohort.sql
new file mode 100644
index 00000000..33454cff
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_server/generateCohort.sql
@@ -0,0 +1,181 @@
+@codesetQuery
+
+with primary_events (event_id, person_id, start_date, end_date, op_start_date, op_end_date, visit_occurrence_id) as
+(
+@primaryEventsQuery
+)
+SELECT event_id, person_id, start_date, end_date, op_start_date, op_end_date, visit_occurrence_id
+INTO #qualified_events
+FROM
+(
+ select pe.event_id, pe.person_id, pe.start_date, pe.end_date, pe.op_start_date, pe.op_end_date, row_number() over (partition by pe.person_id order by pe.start_date @QualifiedEventSort) as ordinal, cast(pe.visit_occurrence_id as bigint) as visit_occurrence_id
+ FROM primary_events pe
+ @additionalCriteriaQuery
+) QE
+@QualifiedLimitFilter
+;
+
+--- Inclusion Rule Inserts
+
+@inclusionCohortInserts
+
+with cteIncludedEvents(event_id, person_id, start_date, end_date, op_start_date, op_end_date, ordinal) as
+(
+ SELECT event_id, person_id, start_date, end_date, op_start_date, op_end_date, row_number() over (partition by person_id order by start_date @IncludedEventSort) as ordinal
+ from
+ (
+ select Q.event_id, Q.person_id, Q.start_date, Q.end_date, Q.op_start_date, Q.op_end_date, SUM(coalesce(POWER(cast(2 as bigint), I.inclusion_rule_id), 0)) as inclusion_rule_mask
+ from #qualified_events Q
+ LEFT JOIN #inclusion_events I on I.person_id = Q.person_id and I.event_id = Q.event_id
+ GROUP BY Q.event_id, Q.person_id, Q.start_date, Q.end_date, Q.op_start_date, Q.op_end_date
+ ) MG -- matching groups
+{@ruleTotal != 0}?{
+ -- the matching group with all bits set ( POWER(2,# of inclusion rules) - 1 = inclusion_rule_mask
+ WHERE (MG.inclusion_rule_mask = POWER(cast(2 as bigint),@ruleTotal)-1)
+}
+)
+select event_id, person_id, start_date, end_date, op_start_date, op_end_date
+into #included_events
+FROM cteIncludedEvents Results
+@ResultLimitFilter
+;
+
+@strategy_ends_temp_tables
+
+-- generate cohort periods into #final_cohort
+with cohort_ends (event_id, person_id, end_date) as
+(
+ -- cohort exit dates
+ @cohort_end_unions
+),
+first_ends (person_id, start_date, end_date) as
+(
+ select F.person_id, F.start_date, F.end_date
+ FROM (
+ select I.event_id, I.person_id, I.start_date, E.end_date, row_number() over (partition by I.person_id, I.event_id order by E.end_date) as ordinal
+ from #included_events I
+ join cohort_ends E on I.event_id = E.event_id and I.person_id = E.person_id and E.end_date >= I.start_date
+ ) F
+ WHERE F.ordinal = 1
+)
+select person_id, start_date, end_date
+INTO #cohort_rows
+from first_ends;
+
+with cteEndDates (person_id, end_date) AS -- the magic
+(
+ SELECT
+ person_id
+ , DATEADD(day,-1 * @eraconstructorpad, event_date) as end_date
+ FROM
+ (
+ SELECT
+ person_id
+ , event_date
+ , event_type
+ , MAX(start_ordinal) OVER (PARTITION BY person_id ORDER BY event_date, event_type ROWS UNBOUNDED PRECEDING) AS start_ordinal
+ , ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY event_date, event_type) AS overall_ord
+ FROM
+ (
+ SELECT
+ person_id
+ , start_date AS event_date
+ , -1 AS event_type
+ , ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY start_date) AS start_ordinal
+ FROM #cohort_rows
+
+ UNION ALL
+
+
+ SELECT
+ person_id
+ , DATEADD(day,@eraconstructorpad,end_date) as end_date
+ , 1 AS event_type
+ , NULL
+ FROM #cohort_rows
+ ) RAWDATA
+ ) e
+ WHERE (2 * e.start_ordinal) - e.overall_ord = 0
+),
+cteEnds (person_id, start_date, end_date) AS
+(
+ SELECT
+ c.person_id
+ , c.start_date
+ , MIN(e.end_date) AS end_date
+ FROM #cohort_rows c
+ JOIN cteEndDates e ON c.person_id = e.person_id AND e.end_date >= c.start_date
+ GROUP BY c.person_id, c.start_date
+)
+select person_id, min(start_date) as start_date, end_date
+into #final_cohort
+from cteEnds
+group by person_id, end_date
+;
+
+DELETE FROM @target_database_schema.@target_cohort_table where @cohort_id_field_name = @target_cohort_id;
+INSERT INTO @target_database_schema.@target_cohort_table (@cohort_id_field_name, subject_id, cohort_start_date, cohort_end_date)
+@finalCohortQuery
+;
+
+{@generateStats != 0}?{
+-- Find the event that is the 'best match' per person.
+-- the 'best match' is defined as the event that satisfies the most inclusion rules.
+-- ties are solved by choosing the event that matches the earliest inclusion rule, and then earliest.
+
+select q.person_id, q.event_id
+into #best_events
+from #qualified_events Q
+join (
+ SELECT R.person_id, R.event_id, ROW_NUMBER() OVER (PARTITION BY R.person_id ORDER BY R.rule_count DESC,R.min_rule_id ASC, R.start_date ASC) AS rank_value
+ FROM (
+ SELECT Q.person_id, Q.event_id, COALESCE(COUNT(DISTINCT I.inclusion_rule_id), 0) AS rule_count, COALESCE(MIN(I.inclusion_rule_id), 0) AS min_rule_id, Q.start_date
+ FROM #qualified_events Q
+ LEFT JOIN #inclusion_events I ON q.person_id = i.person_id AND q.event_id = i.event_id
+ GROUP BY Q.person_id, Q.event_id, Q.start_date
+ ) R
+) ranked on Q.person_id = ranked.person_id and Q.event_id = ranked.event_id
+WHERE ranked.rank_value = 1
+;
+
+-- modes of generation: (the same tables store the results for the different modes, identified by the mode_id column)
+-- 0: all events
+-- 1: best event
+
+
+-- BEGIN: Inclusion Impact Analysis - event
+@inclusionImpactAnalysisByEventQuery
+-- END: Inclusion Impact Analysis - event
+
+-- BEGIN: Inclusion Impact Analysis - person
+@inclusionImpactAnalysisByPersonQuery
+-- END: Inclusion Impact Analysis - person
+
+-- BEGIN: Censored Stats
+@cohortCensoredStatsQuery
+-- END: Censored Stats
+
+TRUNCATE TABLE #best_events;
+DROP TABLE #best_events;
+
+}
+
+@strategy_ends_cleanup
+
+TRUNCATE TABLE #cohort_rows;
+DROP TABLE #cohort_rows;
+
+TRUNCATE TABLE #final_cohort;
+DROP TABLE #final_cohort;
+
+TRUNCATE TABLE #inclusion_events;
+DROP TABLE #inclusion_events;
+
+TRUNCATE TABLE #qualified_events;
+DROP TABLE #qualified_events;
+
+TRUNCATE TABLE #included_events;
+DROP TABLE #included_events;
+
+TRUNCATE TABLE #Codesets;
+DROP TABLE #Codesets;
diff --git a/src/main/resources/resources/cohortdefinition/sql_server/groupQuery.sql b/src/main/resources/resources/cohortdefinition/sql_server/groupQuery.sql
new file mode 100644
index 00000000..01252e94
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_server/groupQuery.sql
@@ -0,0 +1,14 @@
+-- Begin Criteria Group
+select @indexId as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM @eventTable E
+ @joinType JOIN
+ (
+ @criteriaQueries
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ @occurrenceCountClause
+) G
+-- End Criteria Group
diff --git a/src/main/resources/resources/cohortdefinition/sql_server/inclusionrule.sql b/src/main/resources/resources/cohortdefinition/sql_server/inclusionrule.sql
new file mode 100644
index 00000000..bee0cb9b
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_server/inclusionrule.sql
@@ -0,0 +1,9 @@
+select @inclusion_rule_id as inclusion_rule_id, person_id, event_id
+INTO #Inclusion_@inclusion_rule_id
+FROM
+(
+ select pe.person_id, pe.event_id
+ FROM #qualified_events pe
+ @additionalCriteriaQuery
+) Results
+;
diff --git a/src/main/resources/resources/cohortdefinition/sql_server/locationRegion.sql b/src/main/resources/resources/cohortdefinition/sql_server/locationRegion.sql
new file mode 100644
index 00000000..edcfa718
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_server/locationRegion.sql
@@ -0,0 +1,18 @@
+-- Begin Location region Criteria
+select
+ C.entity_id AS person_id,
+ C.location_history_id as event_id,
+ C.start_date as start_date,
+ ISNULL(C.end_date, DATEFROMPARTS(2099,12,31)) as end_date,
+ C.region_concept_id as TARGET_CONCEPT_ID,
+ CAST(NULL as bigint) as visit_occurrence_id,
+ C.start_date as sort_date
+from
+(
+ select l.*, lh.*
+ FROM @cdm_database_schema.LOCATION l
+ JOIN @cdm_database_schema.LOCATION_HISTORY lh ON l.location_id = lh.location_id
+@codesetClause
+ WHERE lh.domain_id = 'PERSON'
+) C
+-- End Location region Criteria
diff --git a/src/main/resources/resources/cohortdefinition/sql_server/measurement.sql b/src/main/resources/resources/cohortdefinition/sql_server/measurement.sql
new file mode 100644
index 00000000..06368e14
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_server/measurement.sql
@@ -0,0 +1,13 @@
+-- Begin Measurement Criteria
+select C.person_id, C.measurement_id as event_id, C.measurement_date as start_date, DATEADD(d,1,C.measurement_date) as END_DATE,
+ C.measurement_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.measurement_date as sort_date
+from
+(
+ select m.* @ordinalExpression
+ FROM @cdm_database_schema.MEASUREMENT m
+@codesetClause
+) C
+@joinClause
+@whereClause
+-- End Measurement Criteria
diff --git a/src/main/resources/resources/cohortdefinition/sql_server/observation.sql b/src/main/resources/resources/cohortdefinition/sql_server/observation.sql
new file mode 100644
index 00000000..ff45bce4
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_server/observation.sql
@@ -0,0 +1,13 @@
+-- Begin Observation Criteria
+select C.person_id, C.observation_id as event_id, C.observation_date as start_date, DATEADD(d,1,C.observation_date) as END_DATE,
+ C.observation_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.observation_date as sort_date
+from
+(
+ select o.* @ordinalExpression
+ FROM @cdm_database_schema.OBSERVATION o
+@codesetClause
+) C
+@joinClause
+@whereClause
+-- End Observation Criteria
diff --git a/src/main/resources/resources/cohortdefinition/sql_server/observationPeriod.sql b/src/main/resources/resources/cohortdefinition/sql_server/observationPeriod.sql
new file mode 100644
index 00000000..15f3a192
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_server/observationPeriod.sql
@@ -0,0 +1,13 @@
+-- Begin Observation Period Criteria
+select C.person_id, C.observation_period_id as event_id, @startDateExpression as start_date, @endDateExpression as end_date,
+ C.period_type_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.observation_period_start_date as sort_date
+
+from
+(
+ select op.*, row_number() over (PARTITION BY op.person_id ORDER BY op.observation_period_start_date) as ordinal
+ FROM @cdm_database_schema.OBSERVATION_PERIOD op
+) C
+@joinClause
+@whereClause
+-- End Observation Period Criteria
diff --git a/src/main/resources/resources/cohortdefinition/sql_server/payerPlanPeriod.sql b/src/main/resources/resources/cohortdefinition/sql_server/payerPlanPeriod.sql
new file mode 100644
index 00000000..d6b06403
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_server/payerPlanPeriod.sql
@@ -0,0 +1,13 @@
+-- Begin Payer Plan Period Criteria
+select C.person_id, C.payer_plan_period_id as event_id, @startDateExpression as start_date, @endDateExpression as end_date,
+ C.payer_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.payer_plan_period_start_date as sort_date
+
+from
+(
+ select ppp.*, row_number() over (PARTITION BY ppp.person_id ORDER BY ppp.payer_plan_period_start_date) as ordinal
+ FROM @cdm_database_schema.PAYER_PLAN_PERIOD ppp
+) C
+@joinClause
+@whereClause
+-- End Payer Plan Period Criteria
diff --git a/src/main/resources/resources/cohortdefinition/sql_server/primaryEventsQuery.sql b/src/main/resources/resources/cohortdefinition/sql_server/primaryEventsQuery.sql
new file mode 100644
index 00000000..534f24f5
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_server/primaryEventsQuery.sql
@@ -0,0 +1,16 @@
+-- Begin Primary Events
+select P.ordinal as event_id, P.person_id, P.start_date, P.end_date, op_start_date, op_end_date, cast(P.visit_occurrence_id as bigint) as visit_occurrence_id
+FROM
+(
+ select E.person_id, E.start_date, E.end_date,
+ row_number() OVER (PARTITION BY E.person_id ORDER BY E.sort_date @EventSort) ordinal,
+ OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date, cast(E.visit_occurrence_id as bigint) as visit_occurrence_id
+ FROM
+ (
+ @criteriaQueries
+ ) E
+ JOIN @cdm_database_schema.observation_period OP on E.person_id = OP.person_id and E.start_date >= OP.observation_period_start_date and E.start_date <= op.observation_period_end_date
+ WHERE @primaryEventsFilter
+) P
+@primaryEventLimit
+-- End Primary Events
diff --git a/src/main/resources/resources/cohortdefinition/sql_server/procedureOccurrence.sql b/src/main/resources/resources/cohortdefinition/sql_server/procedureOccurrence.sql
new file mode 100644
index 00000000..cd377d01
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_server/procedureOccurrence.sql
@@ -0,0 +1,13 @@
+-- Begin Procedure Occurrence Criteria
+select C.person_id, C.procedure_occurrence_id as event_id, C.procedure_date as start_date, DATEADD(d,1,C.procedure_date) as END_DATE,
+ C.procedure_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.procedure_date as sort_date
+from
+(
+ select po.* @ordinalExpression
+ FROM @cdm_database_schema.PROCEDURE_OCCURRENCE po
+@codesetClause
+) C
+@joinClause
+@whereClause
+-- End Procedure Occurrence Criteria
diff --git a/src/main/resources/resources/cohortdefinition/sql_server/specimen.sql b/src/main/resources/resources/cohortdefinition/sql_server/specimen.sql
new file mode 100644
index 00000000..1f1eefbb
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_server/specimen.sql
@@ -0,0 +1,13 @@
+-- Begin Specimen Criteria
+select C.person_id, C.specimen_id as event_id, C.specimen_date as start_date, DATEADD(d,1,C.specimen_date) as end_date,
+ C.specimen_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.specimen_date as sort_date
+from
+(
+ select s.* @ordinalExpression
+ FROM @cdm_database_schema.SPECIMEN s
+@codesetClause
+) C
+@joinClause
+@whereClause
+-- End Specimen Criteria
diff --git a/src/main/resources/resources/cohortdefinition/sql_server/visitOccurrence.sql b/src/main/resources/resources/cohortdefinition/sql_server/visitOccurrence.sql
new file mode 100644
index 00000000..8a242681
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_server/visitOccurrence.sql
@@ -0,0 +1,13 @@
+-- Begin Visit Occurrence Criteria
+select C.person_id, C.visit_occurrence_id as event_id, C.visit_start_date as start_date, C.visit_end_date as end_date,
+ C.visit_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.visit_start_date as sort_date
+from
+(
+ select vo.* @ordinalExpression
+ FROM @cdm_database_schema.VISIT_OCCURRENCE vo
+@codesetClause
+) C
+@joinClause
+@whereClause
+-- End Visit Occurrence Criteria
diff --git a/src/main/resources/resources/cohortdefinition/sql_server/windowedCriteria.sql b/src/main/resources/resources/cohortdefinition/sql_server/windowedCriteria.sql
new file mode 100644
index 00000000..a61e55d6
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_server/windowedCriteria.sql
@@ -0,0 +1,6 @@
+SELECT @indexId as index_id, p.person_id, p.event_id
+FROM @eventTable P
+@joinType JOIN
+(
+ @criteriaQuery
+) A on A.person_id = P.person_id @windowCriteria
\ No newline at end of file
diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/additionalCriteria.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/additionalCriteria.sql
new file mode 100644
index 00000000..db01d00c
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_transforms/additionalCriteria.sql
@@ -0,0 +1,5 @@
+-- Begin Correlated Criteria
+@windowedCriteria
+GROUP BY P.person_id, P.event_id
+@occurrenceCriteria
+-- End Correlated Criteria
diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/censoringInsert.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/censoringInsert.sql
new file mode 100644
index 00000000..224993ba
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_transforms/censoringInsert.sql
@@ -0,0 +1,7 @@
+select i.event_id, i.person_id, MIN(C.start_date) as end_date
+FROM included_events i
+JOIN
+(
+@criteriaQuery
+) C on C.person_id = i.person_id and C.start_date >= i.start_date and C.start_date <= i.op_end_date
+GROUP BY i.event_id, i.person_id
diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/codesetQuery.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/codesetQuery.sql
new file mode 100644
index 00000000..ebc1008d
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_transforms/codesetQuery.sql
@@ -0,0 +1,7 @@
+CREATE TABLE #Codesets (
+ codeset_id int NOT NULL,
+ concept_id bigint NOT NULL
+)
+;
+
+@codesetInserts
diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/cohortCensoredStats.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/cohortCensoredStats.sql
new file mode 100644
index 00000000..8d9f9710
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_transforms/cohortCensoredStats.sql
@@ -0,0 +1,7 @@
+-- calculate censored
+delete from @results_database_schema.cohort_censor_stats where @cohort_id_field_name = @target_cohort_id;
+insert into @results_database_schema.cohort_censor_stats (@cohort_id_field_name, lost_count)
+ select @target_cohort_id as @cohort_id_field_name, coalesce(FCC.total_people - TC.total, 0) as lost_count
+ FROM
+ (select count_big(distinct person_id) as total_people from #final_cohort) FCC,
+ (select count_big(distinct subject_id) as total from @target_database_schema.@target_cohort_table t where t.@cohort_id_field_name = @target_cohort_id) TC;
\ No newline at end of file
diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/cohortInclusionAnalysis.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/cohortInclusionAnalysis.sql
new file mode 100644
index 00000000..85a1d081
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_transforms/cohortInclusionAnalysis.sql
@@ -0,0 +1,44 @@
+-- calculte matching group counts
+delete from @results_database_schema.cohort_inclusion_result where @cohort_id_field_name = @target_cohort_id and mode_id = @inclusionImpactMode;
+insert into @results_database_schema.cohort_inclusion_result (@cohort_id_field_name, inclusion_rule_mask, person_count, mode_id)
+select @target_cohort_id as @cohort_id_field_name, inclusion_rule_mask, count_big(*) as person_count, @inclusionImpactMode as mode_id
+from
+(
+ select Q.person_id, Q.event_id, CAST(SUM(coalesce(POWER(cast(2 as bigint), I.inclusion_rule_id), 0)) AS bigint) as inclusion_rule_mask
+ from @eventTable Q
+ LEFT JOIN #inclusion_events I on q.person_id = i.person_id and q.event_id = i.event_id
+ GROUP BY Q.person_id, Q.event_id
+) MG -- matching groups
+group by inclusion_rule_mask
+;
+
+-- calculate gain counts
+delete from @results_database_schema.cohort_inclusion_stats where @cohort_id_field_name = @target_cohort_id and mode_id = @inclusionImpactMode;
+insert into @results_database_schema.cohort_inclusion_stats (@cohort_id_field_name, rule_sequence, person_count, gain_count, person_total, mode_id)
+select ir.@cohort_id_field_name, ir.rule_sequence, coalesce(T.person_count, 0) as person_count, coalesce(SR.person_count, 0) gain_count, EventTotal.total, @inclusionImpactMode as mode_id
+from @results_database_schema.cohort_inclusion ir
+left join
+(
+ select i.inclusion_rule_id, count_big(i.event_id) as person_count
+ from @eventTable Q
+ JOIN #inclusion_events i on Q.person_id = I.person_id and Q.event_id = i.event_id
+ group by i.inclusion_rule_id
+) T on ir.rule_sequence = T.inclusion_rule_id
+CROSS JOIN (select count(*) as total_rules from @results_database_schema.cohort_inclusion where @cohort_id_field_name = @target_cohort_id) RuleTotal
+CROSS JOIN (select count_big(event_id) as total from @eventTable) EventTotal
+LEFT JOIN @results_database_schema.cohort_inclusion_result SR on SR.mode_id = @inclusionImpactMode AND SR.@cohort_id_field_name = @target_cohort_id AND (POWER(cast(2 as bigint),RuleTotal.total_rules) - POWER(cast(2 as bigint),ir.rule_sequence) - 1) = SR.inclusion_rule_mask -- POWER(2,rule count) - POWER(2,rule sequence) - 1 is the mask for 'all except this rule'
+WHERE ir.@cohort_id_field_name = @target_cohort_id
+;
+
+-- calculate totals
+delete from @results_database_schema.cohort_summary_stats where @cohort_id_field_name = @target_cohort_id and mode_id = @inclusionImpactMode;
+insert into @results_database_schema.cohort_summary_stats (@cohort_id_field_name, base_count, final_count, mode_id)
+select @target_cohort_id as @cohort_id_field_name, PC.total as person_count, coalesce(FC.total, 0) as final_count, @inclusionImpactMode as mode_id
+FROM
+(select count_big(event_id) as total from @eventTable) PC,
+(select sum(sr.person_count) as total
+ from @results_database_schema.cohort_inclusion_result sr
+ CROSS JOIN (select count(*) as total_rules from @results_database_schema.cohort_inclusion where @cohort_id_field_name = @target_cohort_id) RuleTotal
+ where sr.mode_id = @inclusionImpactMode and sr.@cohort_id_field_name = @target_cohort_id and sr.inclusion_rule_mask = POWER(cast(2 as bigint),RuleTotal.total_rules)-1
+) FC
+;
diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/conditionEra.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/conditionEra.sql
new file mode 100644
index 00000000..fb99a3e6
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_transforms/conditionEra.sql
@@ -0,0 +1,13 @@
+-- Begin Condition Era Criteria
+select C.person_id, C.condition_era_id as event_id, C.condition_era_start_date as start_date,
+ C.condition_era_end_date as end_date, C.condition_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.condition_era_start_date as sort_date
+from
+(
+ select ce.* @ordinalExpression
+ FROM `@cdm_database_schema/condition_era` ce
+@codesetClause
+) C
+@joinClause
+@whereClause
+-- End Condition Era Criteria
diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/conditionOccurrence.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/conditionOccurrence.sql
new file mode 100644
index 00000000..bb57faf3
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_transforms/conditionOccurrence.sql
@@ -0,0 +1,13 @@
+-- Begin Condition Occurrence Criteria
+SELECT C.person_id, C.condition_occurrence_id as event_id, C.condition_start_date as start_date, COALESCE(C.condition_end_date, date_add(C.condition_start_date, 1)) as end_date,
+ C.condition_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.condition_start_date as sort_date
+FROM
+(
+ SELECT co.* @ordinalExpression
+ FROM `@cdm_database_schema/condition_occurrence` co
+ @codesetClause
+) C
+@joinClause
+@whereClause
+-- End Condition Occurrence Criteria
diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/customEraStrategy.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/customEraStrategy.sql
new file mode 100644
index 00000000..513ebaa3
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_transforms/customEraStrategy.sql
@@ -0,0 +1,65 @@
+-- custom era strategy
+
+with ctePersons(person_id) as (
+ select distinct person_id from @eventTable
+)
+
+select person_id, drug_exposure_start_date, drug_exposure_end_date
+INTO #drugTarget
+FROM (
+ select de.PERSON_ID, DRUG_EXPOSURE_START_DATE, @drugExposureEndDateExpression as DRUG_EXPOSURE_END_DATE
+ FROM @cdm_database_schema.DRUG_EXPOSURE de
+ JOIN ctePersons p on de.person_id = p.person_id
+ JOIN #Codesets cs on cs.codeset_id = @drugCodesetId AND de.drug_concept_id = cs.concept_id
+
+ UNION ALL
+
+ select de.PERSON_ID, DRUG_EXPOSURE_START_DATE, @drugExposureEndDateExpression as DRUG_EXPOSURE_END_DATE
+ FROM @cdm_database_schema.DRUG_EXPOSURE de
+ JOIN ctePersons p on de.person_id = p.person_id
+ JOIN #Codesets cs on cs.codeset_id = @drugCodesetId AND de.drug_source_concept_id = cs.concept_id
+) E
+;
+
+select et.event_id, et.person_id, ERAS.era_end_date as end_date
+INTO #strategy_ends
+from @eventTable et
+JOIN
+(
+ select ENDS.person_id, min(drug_exposure_start_date) as era_start_date, DATEADD(day,@offset, ENDS.era_end_date) as era_end_date
+ from
+ (
+ select de.person_id, de.drug_exposure_start_date, MIN(e.END_DATE) as era_end_date
+ FROM #drugTarget DE
+ JOIN
+ (
+ --cteEndDates
+ select PERSON_ID, DATEADD(day,-1 * @gapDays,EVENT_DATE) as END_DATE -- unpad the end date by @gapDays
+ FROM
+ (
+ select PERSON_ID, EVENT_DATE, EVENT_TYPE,
+ MAX(START_ORDINAL) OVER (PARTITION BY PERSON_ID ORDER BY event_date, event_type ROWS UNBOUNDED PRECEDING) AS start_ordinal,
+ ROW_NUMBER() OVER (PARTITION BY PERSON_ID ORDER BY EVENT_DATE, EVENT_TYPE) AS OVERALL_ORD -- this re-numbers the inner UNION so all rows are numbered ordered by the event date
+ from
+ (
+ -- select the start dates, assigning a row number to each
+ Select PERSON_ID, DRUG_EXPOSURE_START_DATE AS EVENT_DATE, 0 as EVENT_TYPE, ROW_NUMBER() OVER (PARTITION BY PERSON_ID ORDER BY DRUG_EXPOSURE_START_DATE) as START_ORDINAL
+ from #drugTarget D
+
+ UNION ALL
+
+ -- add the end dates with NULL as the row number, padding the end dates by @gapDays to allow a grace period for overlapping ranges.
+ select PERSON_ID, DATEADD(day,@gapDays,DRUG_EXPOSURE_END_DATE), 1 as EVENT_TYPE, NULL
+ FROM #drugTarget D
+ ) RAWDATA
+ ) E
+ WHERE 2 * E.START_ORDINAL - E.OVERALL_ORD = 0
+ ) E on DE.PERSON_ID = E.PERSON_ID and E.END_DATE >= DE.DRUG_EXPOSURE_START_DATE
+ GROUP BY de.person_id, de.drug_exposure_start_date
+ ) ENDS
+ GROUP BY ENDS.person_id, ENDS.era_end_date
+) ERAS on ERAS.person_id = et.person_id
+WHERE et.start_date between ERAS.era_start_date and ERAS.era_end_date;
+
+TRUNCATE TABLE #drugTarget;
+DROP TABLE #drugTarget;
diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/dateOffsetStrategy.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/dateOffsetStrategy.sql
new file mode 100644
index 00000000..7e043822
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_transforms/dateOffsetStrategy.sql
@@ -0,0 +1,7 @@
+-- date offset strategy
+
+strategy_ends AS (
+ select event_id, person_id,
+ case when date_add(@dateField, @offset) > start_date then date_add(@dateField, @offset) else start_date end as end_date
+ from @eventTable
+),
\ No newline at end of file
diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/death.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/death.sql
new file mode 100644
index 00000000..32ab8b57
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_transforms/death.sql
@@ -0,0 +1,14 @@
+-- Begin Death Criteria
+select C.person_id, C.person_id as event_id, C.death_date as start_date, date_add(C.death_date, 1) as end_date,
+ coalesce(C.cause_concept_id,0) as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.death_date as sort_date
+from
+(
+ select d.*
+ FROM `@cdm_database_schema/death` d
+@codesetClause
+) C
+@joinClause
+@whereClause
+-- End Death Criteria
+
diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/demographicCriteria.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/demographicCriteria.sql
new file mode 100644
index 00000000..3387220a
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_transforms/demographicCriteria.sql
@@ -0,0 +1,7 @@
+-- Begin Demographic Criteria
+SELECT @indexId as index_id, e.person_id, e.event_id
+FROM @eventTable e
+JOIN `@cdm_database_schema/person` P ON P.person_id = e.person_id
+@whereClause
+GROUP BY e.person_id, e.event_id
+-- End Demographic Criteria
diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/deviceExposure.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/deviceExposure.sql
new file mode 100644
index 00000000..d0d25986
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_transforms/deviceExposure.sql
@@ -0,0 +1,13 @@
+-- Begin Device Exposure Criteria
+select C.person_id, C.device_exposure_id as event_id, C.device_exposure_start_date as start_date, C.device_exposure_end_date as end_date,
+ C.device_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.device_exposure_start_date as sort_date
+from
+(
+ select de.* @ordinalExpression
+ FROM `@cdm_database_schema/device_exposure` de
+@codesetClause
+) C
+@joinClause
+@whereClause
+-- End Device Exposure Criteria
diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/doseEra.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/doseEra.sql
new file mode 100644
index 00000000..b1a61841
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_transforms/doseEra.sql
@@ -0,0 +1,13 @@
+-- Begin Dose Era Criteria
+select C.person_id, C.dose_era_id as event_id, C.dose_era_start_date as start_date, C.dose_era_end_date as end_date,
+ C.drug_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.dose_era_start_date as sort_date
+from
+(
+ select de.* @ordinalExpression
+ FROM `@cdm_database_schema/dose_era` de
+@codesetClause
+) C
+@joinClause
+@whereClause
+-- End Dose Era Criteria
diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/drugEra.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/drugEra.sql
new file mode 100644
index 00000000..7af9d0ce
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_transforms/drugEra.sql
@@ -0,0 +1,13 @@
+-- Begin Drug Era Criteria
+select C.person_id, C.drug_era_id as event_id, C.drug_era_start_date as start_date, C.drug_era_end_date as end_date,
+ C.drug_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.drug_era_start_date as sort_date
+from
+(
+ select de.* @ordinalExpression
+ FROM `@cdm_database_schema/drug_era` de
+@codesetClause
+) C
+@joinClause
+@whereClause
+-- End Drug Era Criteria
diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/drugExposure.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/drugExposure.sql
new file mode 100644
index 00000000..a7c9b09e
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_transforms/drugExposure.sql
@@ -0,0 +1,14 @@
+-- Begin Drug Exposure Criteria
+select C.person_id, C.drug_exposure_id as event_id, C.drug_exposure_start_date as start_date,
+ COALESCE(C.drug_exposure_end_date, date_add(C.drug_exposure_start_date, C.days_supply), date_add(C.drug_exposure_start_date, 1)) as end_date,
+ C.drug_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.drug_exposure_start_date as sort_date
+from
+(
+ select de.* @ordinalExpression
+ FROM `@cdm_database_schema/drug_exposure` de
+@codesetClause
+) C
+@joinClause
+@whereClause
+-- End Drug Exposure Criteria
diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/eraConstructor.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/eraConstructor.sql
new file mode 100644
index 00000000..99620248
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_transforms/eraConstructor.sql
@@ -0,0 +1,74 @@
+-- era constructor
+WITH cteSource AS
+(
+ SELECT
+ @eraGroup
+ , start_date
+ , end_date
+ , dense_rank() over(order by @eraGroup) as groupid
+ FROM collapse_input so
+)
+,
+--------------------------------------------------------------------------------------------------------------
+cteEndDates AS -- the magic
+(
+ SELECT
+ groupid
+ , date_add(event_date, -1 * @eraconstructorpad) as end_date
+ FROM
+ (
+ SELECT
+ groupid
+ , event_date
+ , event_type
+ , MAX(start_ordinal) OVER (PARTITION BY groupid ORDER BY event_date, event_type ROWS UNBOUNDED PRECEDING) AS start_ordinal
+ , ROW_NUMBER() OVER (PARTITION BY groupid ORDER BY event_date, event_type) AS overall_ord
+ FROM
+ (
+
+ SELECT
+ groupid
+ , start_date AS event_date
+ , -1 AS event_type
+ , ROW_NUMBER() OVER (PARTITION BY groupid ORDER BY start_date) AS start_ordinal
+ FROM cteSource
+
+ UNION ALL
+
+
+ SELECT
+ groupid
+ , date_add(end_date, @eraconstructorpad) as end_date
+ , 1 AS event_type
+ , NULL
+ FROM cteSource
+ ) RAWDATA
+ ) e
+ WHERE (2 * e.start_ordinal) - e.overall_ord = 0
+),
+--------------------------------------------------------------------------------------------------------------
+cteEnds AS
+(
+ SELECT
+ c.groupid
+ , c.start_date
+ , MIN(e.end_date) AS era_end_date
+ FROM cteSource c
+ JOIN cteEndDates e ON c.groupid = e.groupid AND e.end_date >= c.start_date
+ GROUP BY
+ c.groupid
+ , c.start_date
+),
+collapse_output AS
+(
+ select @eraGroup, start_date, end_date
+ from
+ (
+ select @eraGroup , min(b.start_date) as start_date, b.end_date
+ from (
+ select distinct @eraGroup, groupid from cteSource
+ ) a
+ inner join cteEnds b on a.groupid = b.groupid
+ group by @eraGroup, end_date
+ ) q
+),
\ No newline at end of file
diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/eventTableExpression.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/eventTableExpression.sql
new file mode 100644
index 00000000..30c43065
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_transforms/eventTableExpression.sql
@@ -0,0 +1,4 @@
+SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, op.observation_period_start_date as op_start_date, op.observation_period_end_date as op_end_date
+FROM (@eventQuery) Q
+JOIN `@cdm_database_schema/observation_period` op on Q.person_id = op.person_id
+ and op.observation_period_start_date <= Q.start_date and op.observation_period_end_date >= Q.start_date
diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/generateCohort.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/generateCohort.sql
new file mode 100644
index 00000000..fba760a0
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_transforms/generateCohort.sql
@@ -0,0 +1,165 @@
+CREATE TABLE `@target_database_schema.@target_cohort_table` AS
+
+with primary_events as
+(
+@primaryEventsQuery
+),
+qualified_events AS (
+ SELECT event_id, person_id, start_date, end_date, op_start_date, op_end_date, visit_occurrence_id
+ FROM
+ (
+ select pe.event_id, pe.person_id, pe.start_date, pe.end_date, pe.op_start_date, pe.op_end_date, row_number() over (partition by pe.person_id order by pe.start_date @QualifiedEventSort) as ordinal, cast(pe.visit_occurrence_id as bigint) as visit_occurrence_id
+ FROM primary_events pe
+ @additionalCriteriaQuery
+ ) QE
+ @QualifiedLimitFilter
+),
+
+--- Inclusion Rule Inserts
+
+@inclusionCohortInserts
+
+cteIncludedEvents as
+(
+ SELECT event_id, person_id, start_date, end_date, op_start_date, op_end_date, row_number() over (partition by person_id order by start_date @IncludedEventSort) as ordinal
+ from
+ (
+ select Q.event_id, Q.person_id, Q.start_date, Q.end_date, Q.op_start_date, Q.op_end_date, SUM(coalesce(POWER(cast(2 as bigint), I.inclusion_rule_id), 0)) as inclusion_rule_mask
+ from qualified_events Q
+ LEFT JOIN inclusion_events I on I.person_id = Q.person_id and I.event_id = Q.event_id
+ GROUP BY Q.event_id, Q.person_id, Q.start_date, Q.end_date, Q.op_start_date, Q.op_end_date
+ ) MG -- matching groups
+{@ruleTotal != 0}?{
+ -- the matching group with all bits set ( POWER(2,# of inclusion rules) - 1 = inclusion_rule_mask
+ WHERE (MG.inclusion_rule_mask = POWER(cast(2 as bigint),@ruleTotal)-1)
+}
+),
+
+included_events AS (
+ select event_id, person_id, start_date, end_date, op_start_date, op_end_date
+ FROM cteIncludedEvents Results
+ @ResultLimitFilter
+),
+
+@strategy_ends_temp_tables
+
+-- generate cohort periods into #final_cohort
+cohort_ends as
+(
+ -- cohort exit dates
+ @cohort_end_unions
+),
+
+first_ends as
+(
+ select F.person_id, F.start_date, F.end_date
+ FROM (
+ select I.event_id, I.person_id, I.start_date, E.end_date, row_number() over (partition by I.person_id, I.event_id order by E.end_date) as ordinal
+ from included_events I
+ join cohort_ends E on I.event_id = E.event_id and I.person_id = E.person_id and E.end_date >= I.start_date
+ ) F
+ WHERE F.ordinal = 1
+),
+
+cohort_rows AS (
+ select person_id, start_date, end_date
+ from first_ends
+),
+
+cteEndDates AS -- the magic
+(
+ SELECT
+ person_id
+ , date_add(event_date, -1 * @eraconstructorpad) as end_date
+ FROM
+ (
+ SELECT
+ person_id
+ , event_date
+ , event_type
+ , MAX(start_ordinal) OVER (PARTITION BY person_id ORDER BY event_date, event_type ROWS UNBOUNDED PRECEDING) AS start_ordinal
+ , ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY event_date, event_type) AS overall_ord
+ FROM
+ (
+ SELECT
+ person_id
+ , start_date AS event_date
+ , -1 AS event_type
+ , ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY start_date) AS start_ordinal
+ FROM cohort_rows
+
+ UNION ALL
+
+
+ SELECT
+ person_id
+ , date_add(end_date, @eraconstructorpad) as end_date
+ , 1 AS event_type
+ , NULL
+ FROM cohort_rows
+ ) RAWDATA
+ ) e
+ WHERE (2 * e.start_ordinal) - e.overall_ord = 0
+),
+cteEnds AS
+(
+ SELECT
+ c.person_id
+ , c.start_date
+ , MIN(e.end_date) AS end_date
+ FROM cohort_rows c
+ JOIN cteEndDates e ON c.person_id = e.person_id AND e.end_date >= c.start_date
+ GROUP BY c.person_id, c.start_date
+),
+final_cohort AS (
+ select person_id, min(start_date) as start_date, end_date
+ from cteEnds
+ group by person_id, end_date
+)
+
+@finalCohortQuery
+
+
+{@generateStats != 0}?{
+-- Find the event that is the 'best match' per person.
+-- the 'best match' is defined as the event that satisfies the most inclusion rules.
+-- ties are solved by choosing the event that matches the earliest inclusion rule, and then earliest.
+
+select q.person_id, q.event_id
+into #best_events
+from #qualified_events Q
+join (
+ SELECT R.person_id, R.event_id, ROW_NUMBER() OVER (PARTITION BY R.person_id ORDER BY R.rule_count DESC,R.min_rule_id ASC, R.start_date ASC) AS rank_value
+ FROM (
+ SELECT Q.person_id, Q.event_id, COALESCE(COUNT(DISTINCT I.inclusion_rule_id), 0) AS rule_count, COALESCE(MIN(I.inclusion_rule_id), 0) AS min_rule_id, Q.start_date
+ FROM #qualified_events Q
+ LEFT JOIN #inclusion_events I ON q.person_id = i.person_id AND q.event_id = i.event_id
+ GROUP BY Q.person_id, Q.event_id, Q.start_date
+ ) R
+) ranked on Q.person_id = ranked.person_id and Q.event_id = ranked.event_id
+WHERE ranked.rank_value = 1
+;
+
+-- modes of generation: (the same tables store the results for the different modes, identified by the mode_id column)
+-- 0: all events
+-- 1: best event
+
+
+-- BEGIN: Inclusion Impact Analysis - event
+@inclusionImpactAnalysisByEventQuery
+-- END: Inclusion Impact Analysis - event
+
+-- BEGIN: Inclusion Impact Analysis - person
+@inclusionImpactAnalysisByPersonQuery
+-- END: Inclusion Impact Analysis - person
+
+-- BEGIN: Censored Stats
+@cohortCensoredStatsQuery
+-- END: Censored Stats
+
+TRUNCATE TABLE #best_events;
+DROP TABLE #best_events;
+
+}
+
+
diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/groupQuery.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/groupQuery.sql
new file mode 100644
index 00000000..01252e94
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_transforms/groupQuery.sql
@@ -0,0 +1,14 @@
+-- Begin Criteria Group
+select @indexId as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM @eventTable E
+ @joinType JOIN
+ (
+ @criteriaQueries
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ @occurrenceCountClause
+) G
+-- End Criteria Group
diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/inclusionrule.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/inclusionrule.sql
new file mode 100644
index 00000000..aca73475
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_transforms/inclusionrule.sql
@@ -0,0 +1,9 @@
+Inclusion_@inclusion_rule_id AS (
+ select @inclusion_rule_id as inclusion_rule_id, person_id, event_id
+ FROM
+ (
+ select pe.person_id, pe.event_id
+ FROM qualified_events pe
+ @additionalCriteriaQuery
+ ) Results
+),
\ No newline at end of file
diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/locationRegion.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/locationRegion.sql
new file mode 100644
index 00000000..193796db
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_transforms/locationRegion.sql
@@ -0,0 +1,18 @@
+-- Begin Location region Criteria
+select
+ C.entity_id AS person_id,
+ C.location_history_id as event_id,
+ C.start_date as start_date,
+ ISNULL(C.end_date, DATEFROMPARTS(2099,12,31)) as end_date,
+ C.region_concept_id as TARGET_CONCEPT_ID,
+ CAST(NULL as bigint) as visit_occurrence_id,
+ C.start_date as sort_date
+from
+(
+ select l.*, lh.*
+ FROM `@cdm_database_schema/location` l
+ JOIN `@cdm_database_schema.location_history` lh ON l.location_id = lh.location_id
+@codesetClause
+ WHERE lh.domain_id = 'PERSON'
+) C
+-- End Location region Criteria
diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/measurement.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/measurement.sql
new file mode 100644
index 00000000..07205cb9
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_transforms/measurement.sql
@@ -0,0 +1,13 @@
+-- Begin Measurement Criteria
+select C.person_id, C.measurement_id as event_id, C.measurement_date as start_date, date_add(C.measurement_date, 1) as end_date,
+ C.measurement_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.measurement_date as sort_date
+from
+(
+ select m.* @ordinalExpression
+ FROM `@cdm_database_schema/measurement` m
+@codesetClause
+) C
+@joinClause
+@whereClause
+-- End Measurement Criteria
diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/observation.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/observation.sql
new file mode 100644
index 00000000..80cce34f
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_transforms/observation.sql
@@ -0,0 +1,13 @@
+-- Begin Observation Criteria
+select C.person_id, C.observation_id as event_id, C.observation_date as start_date, date_add(C.observation_date, 1) as end_date,
+ C.observation_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.observation_date as sort_date
+from
+(
+ select o.* @ordinalExpression
+ FROM `@cdm_database_schema/observation` o
+@codesetClause
+) C
+@joinClause
+@whereClause
+-- End Observation Criteria
diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/observationPeriod.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/observationPeriod.sql
new file mode 100644
index 00000000..11686f9f
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_transforms/observationPeriod.sql
@@ -0,0 +1,13 @@
+-- Begin Observation Period Criteria
+select C.person_id, C.observation_period_id as event_id, @startDateExpression as start_date, @endDateExpression as end_date,
+ C.period_type_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.observation_period_start_date as sort_date
+
+from
+(
+ select op.*, row_number() over (PARTITION BY op.person_id ORDER BY op.observation_period_start_date) as ordinal
+ FROM `@cdm_database_schema/observation_period` op
+) C
+@joinClause
+@whereClause
+-- End Observation Period Criteria
diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/payerPlanPeriod.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/payerPlanPeriod.sql
new file mode 100644
index 00000000..d6b06403
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_transforms/payerPlanPeriod.sql
@@ -0,0 +1,13 @@
+-- Begin Payer Plan Period Criteria
+select C.person_id, C.payer_plan_period_id as event_id, @startDateExpression as start_date, @endDateExpression as end_date,
+ C.payer_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.payer_plan_period_start_date as sort_date
+
+from
+(
+ select ppp.*, row_number() over (PARTITION BY ppp.person_id ORDER BY ppp.payer_plan_period_start_date) as ordinal
+ FROM @cdm_database_schema.PAYER_PLAN_PERIOD ppp
+) C
+@joinClause
+@whereClause
+-- End Payer Plan Period Criteria
diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/primaryEventsQuery.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/primaryEventsQuery.sql
new file mode 100644
index 00000000..1fb79eff
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_transforms/primaryEventsQuery.sql
@@ -0,0 +1,16 @@
+-- Begin Primary Events
+select P.ordinal as event_id, P.person_id, P.start_date, P.end_date, op_start_date, op_end_date, cast(P.visit_occurrence_id as bigint) as visit_occurrence_id
+FROM
+(
+ select E.person_id, E.start_date, E.end_date,
+ row_number() OVER (PARTITION BY E.person_id ORDER BY E.sort_date @EventSort) ordinal,
+ op.observation_period_start_date as op_start_date, op.observation_period_end_date as op_end_date, cast(E.visit_occurrence_id as bigint) as visit_occurrence_id
+ FROM
+ (
+ @criteriaQueries
+ ) E
+ JOIN `@cdm_database_schema/observation_period` op on E.person_id = op.person_id and E.start_date >= op.observation_period_start_date and E.start_date <= op.observation_period_end_date
+ WHERE @primaryEventsFilter
+) P
+@primaryEventLimit
+-- End Primary Events
diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/procedureOccurrence.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/procedureOccurrence.sql
new file mode 100644
index 00000000..60cbff8d
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_transforms/procedureOccurrence.sql
@@ -0,0 +1,13 @@
+-- Begin Procedure Occurrence Criteria
+select C.person_id, C.procedure_occurrence_id as event_id, C.procedure_date as start_date, date_add(C.procedure_date, 1) as end_date,
+ C.procedure_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.procedure_date as sort_date
+from
+(
+ select po.* @ordinalExpression
+ FROM `@cdm_database_schema/procedure_occurrence` po
+@codesetClause
+) C
+@joinClause
+@whereClause
+-- End Procedure Occurrence Criteria
diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/specimen.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/specimen.sql
new file mode 100644
index 00000000..60ff1d03
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_transforms/specimen.sql
@@ -0,0 +1,13 @@
+-- Begin Specimen Criteria
+select C.person_id, C.specimen_id as event_id, C.specimen_date as start_date, date_add(C.specimen_date, 1) as end_date,
+ C.specimen_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.specimen_date as sort_date
+from
+(
+ select s.* @ordinalExpression
+ FROM `@cdm_database_schema/specimen` s
+@codesetClause
+) C
+@joinClause
+@whereClause
+-- End Specimen Criteria
diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/visitOccurrence.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/visitOccurrence.sql
new file mode 100644
index 00000000..248715c7
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_transforms/visitOccurrence.sql
@@ -0,0 +1,13 @@
+-- Begin Visit Occurrence Criteria
+select C.person_id, C.visit_occurrence_id as event_id, C.visit_start_date as start_date, C.visit_end_date as end_date,
+ C.visit_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.visit_start_date as sort_date
+from
+(
+ select vo.* @ordinalExpression
+ FROM `@cdm_database_schema/visit_occurrence` vo
+@codesetClause
+) C
+@joinClause
+@whereClause
+-- End Visit Occurrence Criteria
diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/windowedCriteria.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/windowedCriteria.sql
new file mode 100644
index 00000000..e8284aff
--- /dev/null
+++ b/src/main/resources/resources/cohortdefinition/sql_transforms/windowedCriteria.sql
@@ -0,0 +1,6 @@
+SELECT @indexId as index_id, P.person_id, P.event_id
+FROM @eventTable P
+@joinType JOIN
+(
+ @criteriaQuery
+) A on A.person_id = P.person_id @windowCriteria
\ No newline at end of file
diff --git a/~/Documents/active_projects/circe-be/cohort_sql.sql b/~/Documents/active_projects/circe-be/cohort_sql.sql
new file mode 100644
index 00000000..a5dd3819
--- /dev/null
+++ b/~/Documents/active_projects/circe-be/cohort_sql.sql
@@ -0,0 +1,2620 @@
+CREATE TEMP TABLE Codesets (codeset_id int NOT NULL,
+ concept_id bigint NOT NULL
+)
+;
+
+INSERT INTO Codesets (codeset_id, concept_id)
+SELECT 0 as codeset_id, c.concept_id FROM (select distinct I.concept_id FROM
+(
+ select concept_id from cdm.CONCEPT where 0=1
+) I
+) C
+;
+
+CREATE TEMP TABLE qualified_events
+
+AS
+WITH primary_events (event_id, person_id, start_date, end_date, op_start_date, op_end_date, visit_occurrence_id) AS (
+-- Begin Primary Events
+select P.ordinal as event_id, P.person_id, P.start_date, P.end_date, op_start_date, op_end_date, cast(P.visit_occurrence_id as bigint) as visit_occurrence_id
+FROM
+(
+ select E.person_id, E.start_date, E.end_date,
+ row_number() OVER (PARTITION BY E.person_id ORDER BY E.sort_date ASC) ordinal,
+ OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date, cast(E.visit_occurrence_id as bigint) as visit_occurrence_id
+ FROM
+ (
+ select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM (
+-- Begin Observation Period Criteria
+select C.person_id, C.observation_period_id as event_id, TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as start_date, TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as end_date,
+ C.period_type_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.observation_period_start_date as sort_date
+
+from
+(
+ select op.*, row_number() over (PARTITION BY op.person_id ORDER BY op.observation_period_start_date) as ordinal
+ FROM cdm.OBSERVATION_PERIOD op
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE C.ordinal = 1
+AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')
+AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')
+AND (C.observation_period_end_date >= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_end_date <= TO_DATE(TO_CHAR(2999,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.period_type_concept_id in (44814725,44787739)
+AND ((CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) >= 0 and (CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) <= 999)
+AND (EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth <= 99)
+AND (EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth <= 99)
+-- End Observation Period Criteria
+
+) PE
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Observation Period Criteria
+select C.person_id, C.observation_period_id as event_id, TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as start_date, TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as end_date,
+ C.period_type_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.observation_period_start_date as sort_date
+
+from
+(
+ select op.*, row_number() over (PARTITION BY op.person_id ORDER BY op.observation_period_start_date) as ordinal
+ FROM cdm.OBSERVATION_PERIOD op
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE C.ordinal = 1
+AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')
+AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')
+AND (C.observation_period_end_date >= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_end_date <= TO_DATE(TO_CHAR(2999,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.period_type_concept_id in (44814725,44787739)
+AND ((CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) >= 0 and (CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) <= 999)
+AND (EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth <= 99)
+AND (EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth <= 99)
+-- End Observation Period Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Observation Period Criteria
+select C.person_id, C.observation_period_id as event_id, TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as start_date, TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as end_date,
+ C.period_type_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.observation_period_start_date as sort_date
+
+from
+(
+ select op.*, row_number() over (PARTITION BY op.person_id ORDER BY op.observation_period_start_date) as ordinal
+ FROM cdm.OBSERVATION_PERIOD op
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE C.ordinal = 1
+AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')
+AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')
+AND (C.observation_period_end_date >= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_end_date <= TO_DATE(TO_CHAR(2999,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.period_type_concept_id in (44814725,44787739)
+AND ((CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) >= 0 and (CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) <= 999)
+AND (EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth <= 99)
+AND (EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth <= 99)
+-- End Observation Period Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) P
+INNER JOIN
+(
+ -- Begin Condition Occurrence Criteria
+SELECT C.person_id, C.condition_occurrence_id as event_id, C.condition_start_date as start_date, COALESCE(C.condition_end_date, (C.condition_start_date + 1*INTERVAL'1 day')) as end_date,
+ C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.condition_start_date as sort_date
+FROM
+(
+ SELECT co.*
+ FROM cdm.CONDITION_OCCURRENCE co
+
+) C
+
+
+-- End Condition Occurrence Criteria
+
+) A on A.person_id = P.person_id AND A.visit_occurrence_id = P.visit_occurrence_id
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id
+
+ ) E
+ JOIN cdm.observation_period OP on E.person_id = OP.person_id and E.start_date >= OP.observation_period_start_date and E.start_date <= op.observation_period_end_date
+ WHERE (OP.OBSERVATION_PERIOD_START_DATE + 0*INTERVAL'1 day') <= E.START_DATE AND (E.START_DATE + 0*INTERVAL'1 day') <= OP.OBSERVATION_PERIOD_END_DATE
+) P
+WHERE P.ordinal = 1
+-- End Primary Events
+
+)
+ SELECT
+event_id, person_id, start_date, end_date, op_start_date, op_end_date, visit_occurrence_id
+
+FROM
+(
+ select pe.event_id, pe.person_id, pe.start_date, pe.end_date, pe.op_start_date, pe.op_end_date, row_number() over (partition by pe.person_id order by pe.start_date ASC) as ordinal, cast(pe.visit_occurrence_id as bigint) as visit_occurrence_id
+ FROM primary_events pe
+
+) QE
+
+;
+ANALYZE qualified_events
+;
+
+--- Inclusion Rule Inserts
+
+CREATE TEMP TABLE Inclusion_0
+
+AS
+SELECT
+0 as inclusion_rule_id, person_id, event_id
+
+FROM
+(
+ select pe.person_id, pe.event_id
+ FROM qualified_events pe
+
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM qualified_events E
+ INNER JOIN
+ (
+ -- Begin Demographic Criteria
+SELECT 0 as index_id, e.person_id, e.event_id
+FROM qualified_events E
+JOIN cdm.PERSON P ON P.PERSON_ID = E.PERSON_ID
+WHERE (EXTRACT(YEAR FROM E.start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM E.start_date) - P.year_of_birth <= 99) AND P.gender_concept_id in (8507) AND P.race_concept_id in (8515,38003578) AND P.race_concept_id in (8515,38003578) AND P.ethnicity_concept_id in (38003564) AND (E.start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and E.start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) AND (E.end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and E.end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+GROUP BY e.person_id, e.event_id
+-- End Demographic Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id
+) Results
+;
+ANALYZE Inclusion_0
+;
+
+CREATE TEMP TABLE Inclusion_1
+
+AS
+SELECT
+1 as inclusion_rule_id, person_id, event_id
+
+FROM
+(
+ select pe.person_id, pe.event_id
+ FROM qualified_events pe
+
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM qualified_events E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM qualified_events P
+INNER JOIN
+(
+ select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM (
+-- Begin Condition Occurrence Criteria
+SELECT C.person_id, C.condition_occurrence_id as event_id, C.condition_start_date as start_date, COALESCE(C.condition_end_date, (C.condition_start_date + 1*INTERVAL'1 day')) as end_date,
+ C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.condition_start_date as sort_date
+FROM
+(
+ SELECT co.* , row_number() over (PARTITION BY co.person_id ORDER BY co.condition_start_date, co.condition_occurrence_id) as ordinal
+ FROM cdm.CONDITION_OCCURRENCE co
+ JOIN Codesets codesets on ((co.condition_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (co.condition_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.condition_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.condition_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.condition_type_concept_id in (38000199)
+AND C.stop_reason like '%this is some test text%'
+AND (EXTRACT(YEAR FROM C.condition_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_start_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8507)
+AND PR.specialty_concept_id in (45444755,45418395)
+AND V.visit_concept_id in (9201)
+AND C.ordinal = 1
+-- End Condition Occurrence Criteria
+
+) PE
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Condition Occurrence Criteria
+SELECT C.person_id, C.condition_occurrence_id as event_id, C.condition_start_date as start_date, COALESCE(C.condition_end_date, (C.condition_start_date + 1*INTERVAL'1 day')) as end_date,
+ C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.condition_start_date as sort_date
+FROM
+(
+ SELECT co.* , row_number() over (PARTITION BY co.person_id ORDER BY co.condition_start_date, co.condition_occurrence_id) as ordinal
+ FROM cdm.CONDITION_OCCURRENCE co
+ JOIN Codesets codesets on ((co.condition_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (co.condition_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.condition_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.condition_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.condition_type_concept_id in (38000199)
+AND C.stop_reason like '%this is some test text%'
+AND (EXTRACT(YEAR FROM C.condition_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_start_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8507)
+AND PR.specialty_concept_id in (45444755,45418395)
+AND V.visit_concept_id in (9201)
+AND C.ordinal = 1
+-- End Condition Occurrence Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Condition Occurrence Criteria
+SELECT C.person_id, C.condition_occurrence_id as event_id, C.condition_start_date as start_date, COALESCE(C.condition_end_date, (C.condition_start_date + 1*INTERVAL'1 day')) as end_date,
+ C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.condition_start_date as sort_date
+FROM
+(
+ SELECT co.* , row_number() over (PARTITION BY co.person_id ORDER BY co.condition_start_date, co.condition_occurrence_id) as ordinal
+ FROM cdm.CONDITION_OCCURRENCE co
+ JOIN Codesets codesets on ((co.condition_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (co.condition_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.condition_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.condition_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.condition_type_concept_id in (38000199)
+AND C.stop_reason like '%this is some test text%'
+AND (EXTRACT(YEAR FROM C.condition_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_start_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8507)
+AND PR.specialty_concept_id in (45444755,45418395)
+AND V.visit_concept_id in (9201)
+AND C.ordinal = 1
+-- End Condition Occurrence Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) P
+INNER JOIN
+(
+ -- Begin Condition Occurrence Criteria
+SELECT C.person_id, C.condition_occurrence_id as event_id, C.condition_start_date as start_date, COALESCE(C.condition_end_date, (C.condition_start_date + 1*INTERVAL'1 day')) as end_date,
+ C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.condition_start_date as sort_date
+FROM
+(
+ SELECT co.*
+ FROM cdm.CONDITION_OCCURRENCE co
+
+) C
+
+
+-- End Condition Occurrence Criteria
+
+) A on A.person_id = P.person_id AND A.visit_occurrence_id = P.visit_occurrence_id
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id
+
+) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day')
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id
+) Results
+;
+ANALYZE Inclusion_1
+;
+
+CREATE TEMP TABLE Inclusion_2
+
+AS
+SELECT
+2 as inclusion_rule_id, person_id, event_id
+
+FROM
+(
+ select pe.person_id, pe.event_id
+ FROM qualified_events pe
+
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM qualified_events E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM qualified_events P
+INNER JOIN
+(
+ select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM (
+-- Begin Condition Era Criteria
+select C.person_id, C.condition_era_id as event_id, C.condition_era_start_date as start_date,
+ C.condition_era_end_date as end_date, C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.condition_era_start_date as sort_date
+from
+(
+ select ce.* , row_number() over (PARTITION BY ce.person_id ORDER BY ce.condition_era_start_date, ce.condition_era_id) as ordinal
+ FROM cdm.CONDITION_ERA ce
+where ce.condition_concept_id in (SELECT concept_id from Codesets where codeset_id = 0)
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE (C.condition_era_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_era_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.condition_era_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_era_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.condition_occurrence_count >= 0 and C.condition_occurrence_count <= 99)
+AND ((CAST(C.condition_era_end_date AS DATE) - CAST(C.condition_era_start_date AS DATE)) >= 0 and (CAST(C.condition_era_end_date AS DATE) - CAST(C.condition_era_start_date AS DATE)) <= 99)
+AND (EXTRACT(YEAR FROM C.condition_era_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_era_start_date) - P.year_of_birth <= 99)
+AND (EXTRACT(YEAR FROM C.condition_era_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_era_end_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8507)
+AND C.ordinal = 1
+-- End Condition Era Criteria
+
+) PE
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Condition Era Criteria
+select C.person_id, C.condition_era_id as event_id, C.condition_era_start_date as start_date,
+ C.condition_era_end_date as end_date, C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.condition_era_start_date as sort_date
+from
+(
+ select ce.* , row_number() over (PARTITION BY ce.person_id ORDER BY ce.condition_era_start_date, ce.condition_era_id) as ordinal
+ FROM cdm.CONDITION_ERA ce
+where ce.condition_concept_id in (SELECT concept_id from Codesets where codeset_id = 0)
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE (C.condition_era_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_era_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.condition_era_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_era_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.condition_occurrence_count >= 0 and C.condition_occurrence_count <= 99)
+AND ((CAST(C.condition_era_end_date AS DATE) - CAST(C.condition_era_start_date AS DATE)) >= 0 and (CAST(C.condition_era_end_date AS DATE) - CAST(C.condition_era_start_date AS DATE)) <= 99)
+AND (EXTRACT(YEAR FROM C.condition_era_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_era_start_date) - P.year_of_birth <= 99)
+AND (EXTRACT(YEAR FROM C.condition_era_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_era_end_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8507)
+AND C.ordinal = 1
+-- End Condition Era Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Condition Era Criteria
+select C.person_id, C.condition_era_id as event_id, C.condition_era_start_date as start_date,
+ C.condition_era_end_date as end_date, C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.condition_era_start_date as sort_date
+from
+(
+ select ce.* , row_number() over (PARTITION BY ce.person_id ORDER BY ce.condition_era_start_date, ce.condition_era_id) as ordinal
+ FROM cdm.CONDITION_ERA ce
+where ce.condition_concept_id in (SELECT concept_id from Codesets where codeset_id = 0)
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE (C.condition_era_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_era_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.condition_era_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_era_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.condition_occurrence_count >= 0 and C.condition_occurrence_count <= 99)
+AND ((CAST(C.condition_era_end_date AS DATE) - CAST(C.condition_era_start_date AS DATE)) >= 0 and (CAST(C.condition_era_end_date AS DATE) - CAST(C.condition_era_start_date AS DATE)) <= 99)
+AND (EXTRACT(YEAR FROM C.condition_era_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_era_start_date) - P.year_of_birth <= 99)
+AND (EXTRACT(YEAR FROM C.condition_era_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_era_end_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8507)
+AND C.ordinal = 1
+-- End Condition Era Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) P
+INNER JOIN
+(
+ -- Begin Condition Era Criteria
+select C.person_id, C.condition_era_id as event_id, C.condition_era_start_date as start_date,
+ C.condition_era_end_date as end_date, C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.condition_era_start_date as sort_date
+from
+(
+ select ce.*
+ FROM cdm.CONDITION_ERA ce
+
+) C
+
+
+-- End Condition Era Criteria
+
+) A on A.person_id = P.person_id
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id
+
+) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day')
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id
+) Results
+;
+ANALYZE Inclusion_2
+;
+
+CREATE TEMP TABLE Inclusion_3
+
+AS
+SELECT
+3 as inclusion_rule_id, person_id, event_id
+
+FROM
+(
+ select pe.person_id, pe.event_id
+ FROM qualified_events pe
+
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM qualified_events E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM qualified_events P
+INNER JOIN
+(
+ select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM (
+-- Begin Death Criteria
+select C.person_id, C.person_id as event_id, C.death_date as start_date, (C.death_date + 1*INTERVAL'1 day') as end_date,
+ coalesce(C.cause_concept_id,0) as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.death_date as sort_date
+from
+(
+ select d.*
+ FROM cdm.DEATH d
+JOIN Codesets codesets on ((d.cause_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE (C.death_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.death_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.death_type_concept_id in (256,255,254)
+AND (EXTRACT(YEAR FROM C.death_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.death_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+-- End Death Criteria
+
+
+) PE
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Death Criteria
+select C.person_id, C.person_id as event_id, C.death_date as start_date, (C.death_date + 1*INTERVAL'1 day') as end_date,
+ coalesce(C.cause_concept_id,0) as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.death_date as sort_date
+from
+(
+ select d.*
+ FROM cdm.DEATH d
+JOIN Codesets codesets on ((d.cause_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE (C.death_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.death_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.death_type_concept_id in (256,255,254)
+AND (EXTRACT(YEAR FROM C.death_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.death_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+-- End Death Criteria
+
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Death Criteria
+select C.person_id, C.person_id as event_id, C.death_date as start_date, (C.death_date + 1*INTERVAL'1 day') as end_date,
+ coalesce(C.cause_concept_id,0) as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.death_date as sort_date
+from
+(
+ select d.*
+ FROM cdm.DEATH d
+JOIN Codesets codesets on ((d.cause_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE (C.death_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.death_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.death_type_concept_id in (256,255,254)
+AND (EXTRACT(YEAR FROM C.death_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.death_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+-- End Death Criteria
+
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) P
+INNER JOIN
+(
+ -- Begin Death Criteria
+select C.person_id, C.person_id as event_id, C.death_date as start_date, (C.death_date + 1*INTERVAL'1 day') as end_date,
+ coalesce(C.cause_concept_id,0) as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.death_date as sort_date
+from
+(
+ select d.*
+ FROM cdm.DEATH d
+JOIN Codesets codesets on ((d.cause_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+
+
+-- End Death Criteria
+
+
+) A on A.person_id = P.person_id
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id
+
+) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day')
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id
+) Results
+;
+ANALYZE Inclusion_3
+;
+
+CREATE TEMP TABLE Inclusion_4
+
+AS
+SELECT
+4 as inclusion_rule_id, person_id, event_id
+
+FROM
+(
+ select pe.person_id, pe.event_id
+ FROM qualified_events pe
+
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM qualified_events E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM qualified_events P
+INNER JOIN
+(
+ select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM (
+-- Begin Device Exposure Criteria
+select C.person_id, C.device_exposure_id as event_id, C.device_exposure_start_date as start_date, C.device_exposure_end_date as end_date,
+ C.device_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.device_exposure_start_date as sort_date
+from
+(
+ select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.device_exposure_start_date, de.device_exposure_id) as ordinal
+ FROM cdm.DEVICE_EXPOSURE de
+JOIN Codesets codesets on ((de.device_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (de.device_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.device_exposure_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.device_exposure_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.device_exposure_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.device_exposure_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.device_type_concept_id in (32465,44818706)
+AND C.unique_device_id like '%null%'
+AND (C.quantity >= 0 and C.quantity <= 99)
+AND (EXTRACT(YEAR FROM C.device_exposure_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.device_exposure_start_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004455,38003625,38003626)
+AND V.visit_concept_id in (8717,8756)
+AND C.ordinal = 1
+-- End Device Exposure Criteria
+
+) PE
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Device Exposure Criteria
+select C.person_id, C.device_exposure_id as event_id, C.device_exposure_start_date as start_date, C.device_exposure_end_date as end_date,
+ C.device_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.device_exposure_start_date as sort_date
+from
+(
+ select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.device_exposure_start_date, de.device_exposure_id) as ordinal
+ FROM cdm.DEVICE_EXPOSURE de
+JOIN Codesets codesets on ((de.device_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (de.device_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.device_exposure_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.device_exposure_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.device_exposure_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.device_exposure_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.device_type_concept_id in (32465,44818706)
+AND C.unique_device_id like '%null%'
+AND (C.quantity >= 0 and C.quantity <= 99)
+AND (EXTRACT(YEAR FROM C.device_exposure_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.device_exposure_start_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004455,38003625,38003626)
+AND V.visit_concept_id in (8717,8756)
+AND C.ordinal = 1
+-- End Device Exposure Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Device Exposure Criteria
+select C.person_id, C.device_exposure_id as event_id, C.device_exposure_start_date as start_date, C.device_exposure_end_date as end_date,
+ C.device_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.device_exposure_start_date as sort_date
+from
+(
+ select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.device_exposure_start_date, de.device_exposure_id) as ordinal
+ FROM cdm.DEVICE_EXPOSURE de
+JOIN Codesets codesets on ((de.device_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (de.device_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.device_exposure_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.device_exposure_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.device_exposure_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.device_exposure_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.device_type_concept_id in (32465,44818706)
+AND C.unique_device_id like '%null%'
+AND (C.quantity >= 0 and C.quantity <= 99)
+AND (EXTRACT(YEAR FROM C.device_exposure_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.device_exposure_start_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004455,38003625,38003626)
+AND V.visit_concept_id in (8717,8756)
+AND C.ordinal = 1
+-- End Device Exposure Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) P
+INNER JOIN
+(
+ -- Begin Device Exposure Criteria
+select C.person_id, C.device_exposure_id as event_id, C.device_exposure_start_date as start_date, C.device_exposure_end_date as end_date,
+ C.device_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.device_exposure_start_date as sort_date
+from
+(
+ select de.*
+ FROM cdm.DEVICE_EXPOSURE de
+JOIN Codesets codesets on ((de.device_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+
+
+-- End Device Exposure Criteria
+
+) A on A.person_id = P.person_id AND A.visit_occurrence_id = P.visit_occurrence_id
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id
+
+) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day')
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id
+) Results
+;
+ANALYZE Inclusion_4
+;
+
+CREATE TEMP TABLE Inclusion_5
+
+AS
+SELECT
+5 as inclusion_rule_id, person_id, event_id
+
+FROM
+(
+ select pe.person_id, pe.event_id
+ FROM qualified_events pe
+
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM qualified_events E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM qualified_events P
+INNER JOIN
+(
+ select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM (
+-- Begin Drug Era Criteria
+select C.person_id, C.drug_era_id as event_id, C.drug_era_start_date as start_date, C.drug_era_end_date as end_date,
+ C.drug_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.drug_era_start_date as sort_date
+from
+(
+ select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.drug_era_start_date, de.drug_era_id) as ordinal
+ FROM cdm.DRUG_ERA de
+
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE (C.drug_era_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_era_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.drug_era_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_era_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.drug_exposure_count >= 0 and C.drug_exposure_count <= 99)
+AND ((CAST(C.drug_era_end_date AS DATE) - CAST(C.drug_era_start_date AS DATE)) >= 0 and (CAST(C.drug_era_end_date AS DATE) - CAST(C.drug_era_start_date AS DATE)) <= 99)
+AND (EXTRACT(YEAR FROM C.drug_era_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_era_start_date) - P.year_of_birth <= 99)
+AND (EXTRACT(YEAR FROM C.drug_era_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_era_end_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND C.ordinal = 1
+-- End Drug Era Criteria
+
+) PE
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Drug Era Criteria
+select C.person_id, C.drug_era_id as event_id, C.drug_era_start_date as start_date, C.drug_era_end_date as end_date,
+ C.drug_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.drug_era_start_date as sort_date
+from
+(
+ select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.drug_era_start_date, de.drug_era_id) as ordinal
+ FROM cdm.DRUG_ERA de
+
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE (C.drug_era_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_era_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.drug_era_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_era_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.drug_exposure_count >= 0 and C.drug_exposure_count <= 99)
+AND ((CAST(C.drug_era_end_date AS DATE) - CAST(C.drug_era_start_date AS DATE)) >= 0 and (CAST(C.drug_era_end_date AS DATE) - CAST(C.drug_era_start_date AS DATE)) <= 99)
+AND (EXTRACT(YEAR FROM C.drug_era_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_era_start_date) - P.year_of_birth <= 99)
+AND (EXTRACT(YEAR FROM C.drug_era_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_era_end_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND C.ordinal = 1
+-- End Drug Era Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Drug Era Criteria
+select C.person_id, C.drug_era_id as event_id, C.drug_era_start_date as start_date, C.drug_era_end_date as end_date,
+ C.drug_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.drug_era_start_date as sort_date
+from
+(
+ select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.drug_era_start_date, de.drug_era_id) as ordinal
+ FROM cdm.DRUG_ERA de
+
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE (C.drug_era_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_era_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.drug_era_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_era_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.drug_exposure_count >= 0 and C.drug_exposure_count <= 99)
+AND ((CAST(C.drug_era_end_date AS DATE) - CAST(C.drug_era_start_date AS DATE)) >= 0 and (CAST(C.drug_era_end_date AS DATE) - CAST(C.drug_era_start_date AS DATE)) <= 99)
+AND (EXTRACT(YEAR FROM C.drug_era_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_era_start_date) - P.year_of_birth <= 99)
+AND (EXTRACT(YEAR FROM C.drug_era_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_era_end_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND C.ordinal = 1
+-- End Drug Era Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) P
+INNER JOIN
+(
+ -- Begin Drug Era Criteria
+select C.person_id, C.drug_era_id as event_id, C.drug_era_start_date as start_date, C.drug_era_end_date as end_date,
+ C.drug_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.drug_era_start_date as sort_date
+from
+(
+ select de.*
+ FROM cdm.DRUG_ERA de
+where de.drug_concept_id in (SELECT concept_id from Codesets where codeset_id = 0)
+) C
+
+
+-- End Drug Era Criteria
+
+) A on A.person_id = P.person_id
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id
+
+) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day')
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id
+) Results
+;
+ANALYZE Inclusion_5
+;
+
+CREATE TEMP TABLE Inclusion_6
+
+AS
+SELECT
+6 as inclusion_rule_id, person_id, event_id
+
+FROM
+(
+ select pe.person_id, pe.event_id
+ FROM qualified_events pe
+
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM qualified_events E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM qualified_events P
+INNER JOIN
+(
+ select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM (
+-- Begin Drug Exposure Criteria
+select C.person_id, C.drug_exposure_id as event_id, C.drug_exposure_start_date as start_date,
+ COALESCE(C.DRUG_EXPOSURE_END_DATE, (DRUG_EXPOSURE_START_DATE + C.DAYS_SUPPLY*INTERVAL'1 day'), (C.DRUG_EXPOSURE_START_DATE + 1*INTERVAL'1 day')) as end_date,
+ C.drug_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.drug_exposure_start_date as sort_date
+from
+(
+ select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.drug_exposure_start_date, de.drug_exposure_id) as ordinal
+ FROM cdm.DRUG_EXPOSURE de
+JOIN Codesets codesets on ((de.drug_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (de.drug_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.drug_exposure_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_exposure_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.drug_exposure_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_exposure_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.drug_type_concept_id in (38000175,38000176)
+AND C.stop_reason like '%stop reason%'
+AND (C.refills >= 0 and C.refills <= 99)
+AND (C.quantity >= 0.0000 and C.quantity <= 99.0000)
+AND (C.days_supply >= 0 and C.days_supply <= 99)
+AND C.route_concept_id in (4263689,4023156,4006860)
+AND (C.effective_drug_dose >= 0.0000 and C.effective_drug_dose <= 99.0000)
+AND C.dose_unit_concept_id in (8554,8849,9214)
+AND C.lot_number like '%lot number%'
+AND (EXTRACT(YEAR FROM C.drug_exposure_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_exposure_start_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004446,38003625)
+AND V.visit_concept_id in (262,9201)
+AND C.ordinal = 1
+-- End Drug Exposure Criteria
+
+) PE
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Drug Exposure Criteria
+select C.person_id, C.drug_exposure_id as event_id, C.drug_exposure_start_date as start_date,
+ COALESCE(C.DRUG_EXPOSURE_END_DATE, (DRUG_EXPOSURE_START_DATE + C.DAYS_SUPPLY*INTERVAL'1 day'), (C.DRUG_EXPOSURE_START_DATE + 1*INTERVAL'1 day')) as end_date,
+ C.drug_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.drug_exposure_start_date as sort_date
+from
+(
+ select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.drug_exposure_start_date, de.drug_exposure_id) as ordinal
+ FROM cdm.DRUG_EXPOSURE de
+JOIN Codesets codesets on ((de.drug_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (de.drug_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.drug_exposure_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_exposure_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.drug_exposure_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_exposure_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.drug_type_concept_id in (38000175,38000176)
+AND C.stop_reason like '%stop reason%'
+AND (C.refills >= 0 and C.refills <= 99)
+AND (C.quantity >= 0.0000 and C.quantity <= 99.0000)
+AND (C.days_supply >= 0 and C.days_supply <= 99)
+AND C.route_concept_id in (4263689,4023156,4006860)
+AND (C.effective_drug_dose >= 0.0000 and C.effective_drug_dose <= 99.0000)
+AND C.dose_unit_concept_id in (8554,8849,9214)
+AND C.lot_number like '%lot number%'
+AND (EXTRACT(YEAR FROM C.drug_exposure_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_exposure_start_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004446,38003625)
+AND V.visit_concept_id in (262,9201)
+AND C.ordinal = 1
+-- End Drug Exposure Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Drug Exposure Criteria
+select C.person_id, C.drug_exposure_id as event_id, C.drug_exposure_start_date as start_date,
+ COALESCE(C.DRUG_EXPOSURE_END_DATE, (DRUG_EXPOSURE_START_DATE + C.DAYS_SUPPLY*INTERVAL'1 day'), (C.DRUG_EXPOSURE_START_DATE + 1*INTERVAL'1 day')) as end_date,
+ C.drug_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.drug_exposure_start_date as sort_date
+from
+(
+ select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.drug_exposure_start_date, de.drug_exposure_id) as ordinal
+ FROM cdm.DRUG_EXPOSURE de
+JOIN Codesets codesets on ((de.drug_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (de.drug_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.drug_exposure_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_exposure_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.drug_exposure_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_exposure_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.drug_type_concept_id in (38000175,38000176)
+AND C.stop_reason like '%stop reason%'
+AND (C.refills >= 0 and C.refills <= 99)
+AND (C.quantity >= 0.0000 and C.quantity <= 99.0000)
+AND (C.days_supply >= 0 and C.days_supply <= 99)
+AND C.route_concept_id in (4263689,4023156,4006860)
+AND (C.effective_drug_dose >= 0.0000 and C.effective_drug_dose <= 99.0000)
+AND C.dose_unit_concept_id in (8554,8849,9214)
+AND C.lot_number like '%lot number%'
+AND (EXTRACT(YEAR FROM C.drug_exposure_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_exposure_start_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004446,38003625)
+AND V.visit_concept_id in (262,9201)
+AND C.ordinal = 1
+-- End Drug Exposure Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) P
+INNER JOIN
+(
+ -- Begin Drug Exposure Criteria
+select C.person_id, C.drug_exposure_id as event_id, C.drug_exposure_start_date as start_date,
+ COALESCE(C.DRUG_EXPOSURE_END_DATE, (DRUG_EXPOSURE_START_DATE + C.DAYS_SUPPLY*INTERVAL'1 day'), (C.DRUG_EXPOSURE_START_DATE + 1*INTERVAL'1 day')) as end_date,
+ C.drug_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.drug_exposure_start_date as sort_date
+from
+(
+ select de.*
+ FROM cdm.DRUG_EXPOSURE de
+
+) C
+
+
+-- End Drug Exposure Criteria
+
+) A on A.person_id = P.person_id AND A.visit_occurrence_id = P.visit_occurrence_id
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id
+
+) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day')
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id
+) Results
+;
+ANALYZE Inclusion_6
+;
+
+CREATE TEMP TABLE Inclusion_7
+
+AS
+SELECT
+7 as inclusion_rule_id, person_id, event_id
+
+FROM
+(
+ select pe.person_id, pe.event_id
+ FROM qualified_events pe
+
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM qualified_events E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM qualified_events P
+INNER JOIN
+(
+ select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM (
+-- Begin Measurement Criteria
+select C.person_id, C.measurement_id as event_id, C.measurement_date as start_date, (C.measurement_date + 1*INTERVAL'1 day') as END_DATE,
+ C.measurement_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.measurement_date as sort_date
+from
+(
+ select m.* , row_number() over (PARTITION BY m.person_id ORDER BY m.measurement_date, m.measurement_id) as ordinal
+ FROM cdm.MEASUREMENT m
+JOIN Codesets codesets on ((m.measurement_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.measurement_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.measurement_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.measurement_type_concept_id in (38000183,38000199)
+AND C.operator_concept_id in (4172704)
+AND (C.value_as_number >= 0.0000 and C.value_as_number <= 99.0000)
+AND C.value_as_concept_id in (9191)
+AND C.unit_concept_id in (9256)
+AND (C.range_low >= 0.0000 and C.range_low <= 99.0000)
+AND (C.range_high >= 0.0000 and C.range_high <= 99.0000)
+AND ((C.value_as_number / NULLIF(C.range_low, 0)) >= 0.0000 and (C.value_as_number / NULLIF(C.range_low, 0)) <= 99.0000)
+AND ((C.value_as_number / NULLIF(C.range_high, 0)) >= 0.0000 and (C.value_as_number / NULLIF(C.range_high, 0)) <= 99.0000)
+AND (C.value_as_number < C.range_low or C.value_as_number > C.range_high or C.value_as_concept_id in (4155142, 4155143))
+AND (EXTRACT(YEAR FROM C.measurement_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.measurement_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004446,38003626,38003627)
+AND V.visit_concept_id in (262,9201)
+AND C.ordinal = 1
+-- End Measurement Criteria
+
+) PE
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Measurement Criteria
+select C.person_id, C.measurement_id as event_id, C.measurement_date as start_date, (C.measurement_date + 1*INTERVAL'1 day') as END_DATE,
+ C.measurement_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.measurement_date as sort_date
+from
+(
+ select m.* , row_number() over (PARTITION BY m.person_id ORDER BY m.measurement_date, m.measurement_id) as ordinal
+ FROM cdm.MEASUREMENT m
+JOIN Codesets codesets on ((m.measurement_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.measurement_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.measurement_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.measurement_type_concept_id in (38000183,38000199)
+AND C.operator_concept_id in (4172704)
+AND (C.value_as_number >= 0.0000 and C.value_as_number <= 99.0000)
+AND C.value_as_concept_id in (9191)
+AND C.unit_concept_id in (9256)
+AND (C.range_low >= 0.0000 and C.range_low <= 99.0000)
+AND (C.range_high >= 0.0000 and C.range_high <= 99.0000)
+AND ((C.value_as_number / NULLIF(C.range_low, 0)) >= 0.0000 and (C.value_as_number / NULLIF(C.range_low, 0)) <= 99.0000)
+AND ((C.value_as_number / NULLIF(C.range_high, 0)) >= 0.0000 and (C.value_as_number / NULLIF(C.range_high, 0)) <= 99.0000)
+AND (C.value_as_number < C.range_low or C.value_as_number > C.range_high or C.value_as_concept_id in (4155142, 4155143))
+AND (EXTRACT(YEAR FROM C.measurement_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.measurement_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004446,38003626,38003627)
+AND V.visit_concept_id in (262,9201)
+AND C.ordinal = 1
+-- End Measurement Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Measurement Criteria
+select C.person_id, C.measurement_id as event_id, C.measurement_date as start_date, (C.measurement_date + 1*INTERVAL'1 day') as END_DATE,
+ C.measurement_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.measurement_date as sort_date
+from
+(
+ select m.* , row_number() over (PARTITION BY m.person_id ORDER BY m.measurement_date, m.measurement_id) as ordinal
+ FROM cdm.MEASUREMENT m
+JOIN Codesets codesets on ((m.measurement_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.measurement_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.measurement_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.measurement_type_concept_id in (38000183,38000199)
+AND C.operator_concept_id in (4172704)
+AND (C.value_as_number >= 0.0000 and C.value_as_number <= 99.0000)
+AND C.value_as_concept_id in (9191)
+AND C.unit_concept_id in (9256)
+AND (C.range_low >= 0.0000 and C.range_low <= 99.0000)
+AND (C.range_high >= 0.0000 and C.range_high <= 99.0000)
+AND ((C.value_as_number / NULLIF(C.range_low, 0)) >= 0.0000 and (C.value_as_number / NULLIF(C.range_low, 0)) <= 99.0000)
+AND ((C.value_as_number / NULLIF(C.range_high, 0)) >= 0.0000 and (C.value_as_number / NULLIF(C.range_high, 0)) <= 99.0000)
+AND (C.value_as_number < C.range_low or C.value_as_number > C.range_high or C.value_as_concept_id in (4155142, 4155143))
+AND (EXTRACT(YEAR FROM C.measurement_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.measurement_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004446,38003626,38003627)
+AND V.visit_concept_id in (262,9201)
+AND C.ordinal = 1
+-- End Measurement Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) P
+INNER JOIN
+(
+ -- Begin Measurement Criteria
+select C.person_id, C.measurement_id as event_id, C.measurement_date as start_date, (C.measurement_date + 1*INTERVAL'1 day') as END_DATE,
+ C.measurement_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.measurement_date as sort_date
+from
+(
+ select m.*
+ FROM cdm.MEASUREMENT m
+JOIN Codesets codesets on ((m.measurement_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+
+
+-- End Measurement Criteria
+
+) A on A.person_id = P.person_id AND A.visit_occurrence_id = P.visit_occurrence_id
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id
+
+) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day')
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id
+) Results
+;
+ANALYZE Inclusion_7
+;
+
+CREATE TEMP TABLE Inclusion_8
+
+AS
+SELECT
+8 as inclusion_rule_id, person_id, event_id
+
+FROM
+(
+ select pe.person_id, pe.event_id
+ FROM qualified_events pe
+
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM qualified_events E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM qualified_events P
+INNER JOIN
+(
+ select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM (
+-- Begin Observation Criteria
+select C.person_id, C.observation_id as event_id, C.observation_date as start_date, (C.observation_date + 1*INTERVAL'1 day') as END_DATE,
+ C.observation_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.observation_date as sort_date
+from
+(
+ select o.* , row_number() over (PARTITION BY o.person_id ORDER BY o.observation_date, o.observation_id) as ordinal
+ FROM cdm.OBSERVATION o
+JOIN Codesets codesets on ((o.observation_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (o.observation_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.observation_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.observation_type_concept_id in (38000183,38000199)
+AND (C.value_as_number >= 0.0000 and C.value_as_number <= 99.0000)
+AND C.value_as_string like '%some value%'
+AND C.value_as_concept_id in (36312355)
+AND C.qualifier_concept_id in (4172703,4171754)
+AND C.unit_concept_id in (8554)
+AND (EXTRACT(YEAR FROM C.observation_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004446,38003627)
+AND V.visit_concept_id in (262,9201)
+AND C.ordinal = 1
+-- End Observation Criteria
+
+) PE
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Observation Criteria
+select C.person_id, C.observation_id as event_id, C.observation_date as start_date, (C.observation_date + 1*INTERVAL'1 day') as END_DATE,
+ C.observation_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.observation_date as sort_date
+from
+(
+ select o.* , row_number() over (PARTITION BY o.person_id ORDER BY o.observation_date, o.observation_id) as ordinal
+ FROM cdm.OBSERVATION o
+JOIN Codesets codesets on ((o.observation_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (o.observation_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.observation_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.observation_type_concept_id in (38000183,38000199)
+AND (C.value_as_number >= 0.0000 and C.value_as_number <= 99.0000)
+AND C.value_as_string like '%some value%'
+AND C.value_as_concept_id in (36312355)
+AND C.qualifier_concept_id in (4172703,4171754)
+AND C.unit_concept_id in (8554)
+AND (EXTRACT(YEAR FROM C.observation_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004446,38003627)
+AND V.visit_concept_id in (262,9201)
+AND C.ordinal = 1
+-- End Observation Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Observation Criteria
+select C.person_id, C.observation_id as event_id, C.observation_date as start_date, (C.observation_date + 1*INTERVAL'1 day') as END_DATE,
+ C.observation_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.observation_date as sort_date
+from
+(
+ select o.* , row_number() over (PARTITION BY o.person_id ORDER BY o.observation_date, o.observation_id) as ordinal
+ FROM cdm.OBSERVATION o
+JOIN Codesets codesets on ((o.observation_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (o.observation_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.observation_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.observation_type_concept_id in (38000183,38000199)
+AND (C.value_as_number >= 0.0000 and C.value_as_number <= 99.0000)
+AND C.value_as_string like '%some value%'
+AND C.value_as_concept_id in (36312355)
+AND C.qualifier_concept_id in (4172703,4171754)
+AND C.unit_concept_id in (8554)
+AND (EXTRACT(YEAR FROM C.observation_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004446,38003627)
+AND V.visit_concept_id in (262,9201)
+AND C.ordinal = 1
+-- End Observation Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) P
+INNER JOIN
+(
+ -- Begin Observation Criteria
+select C.person_id, C.observation_id as event_id, C.observation_date as start_date, (C.observation_date + 1*INTERVAL'1 day') as END_DATE,
+ C.observation_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.observation_date as sort_date
+from
+(
+ select o.*
+ FROM cdm.OBSERVATION o
+JOIN Codesets codesets on ((o.observation_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+
+
+-- End Observation Criteria
+
+) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.visit_occurrence_id = P.visit_occurrence_id
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id
+
+) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day')
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id
+) Results
+;
+ANALYZE Inclusion_8
+;
+
+CREATE TEMP TABLE Inclusion_9
+
+AS
+SELECT
+9 as inclusion_rule_id, person_id, event_id
+
+FROM
+(
+ select pe.person_id, pe.event_id
+ FROM qualified_events pe
+
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM qualified_events E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM qualified_events P
+INNER JOIN
+(
+ select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM (
+-- Begin Observation Period Criteria
+select C.person_id, C.observation_period_id as event_id, TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as start_date, TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as end_date,
+ C.period_type_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.observation_period_start_date as sort_date
+
+from
+(
+ select op.*, row_number() over (PARTITION BY op.person_id ORDER BY op.observation_period_start_date) as ordinal
+ FROM cdm.OBSERVATION_PERIOD op
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE C.ordinal = 1
+AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')
+AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')
+AND (C.observation_period_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.observation_period_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.period_type_concept_id in (38000183,38000199)
+AND ((CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) >= 0 and (CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) <= 99)
+AND (EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth <= 99)
+AND (EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth <= 99)
+-- End Observation Period Criteria
+
+) PE
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Observation Period Criteria
+select C.person_id, C.observation_period_id as event_id, TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as start_date, TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as end_date,
+ C.period_type_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.observation_period_start_date as sort_date
+
+from
+(
+ select op.*, row_number() over (PARTITION BY op.person_id ORDER BY op.observation_period_start_date) as ordinal
+ FROM cdm.OBSERVATION_PERIOD op
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE C.ordinal = 1
+AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')
+AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')
+AND (C.observation_period_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.observation_period_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.period_type_concept_id in (38000183,38000199)
+AND ((CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) >= 0 and (CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) <= 99)
+AND (EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth <= 99)
+AND (EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth <= 99)
+-- End Observation Period Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Observation Period Criteria
+select C.person_id, C.observation_period_id as event_id, TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as start_date, TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as end_date,
+ C.period_type_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.observation_period_start_date as sort_date
+
+from
+(
+ select op.*, row_number() over (PARTITION BY op.person_id ORDER BY op.observation_period_start_date) as ordinal
+ FROM cdm.OBSERVATION_PERIOD op
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE C.ordinal = 1
+AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')
+AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')
+AND (C.observation_period_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.observation_period_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.period_type_concept_id in (38000183,38000199)
+AND ((CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) >= 0 and (CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) <= 99)
+AND (EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth <= 99)
+AND (EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth <= 99)
+-- End Observation Period Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) P
+INNER JOIN
+(
+ -- Begin Observation Period Criteria
+select C.person_id, C.observation_period_id as event_id, C.observation_period_start_date as start_date, C.observation_period_end_date as end_date,
+ C.period_type_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.observation_period_start_date as sort_date
+
+from
+(
+ select op.*, row_number() over (PARTITION BY op.person_id ORDER BY op.observation_period_start_date) as ordinal
+ FROM cdm.OBSERVATION_PERIOD op
+) C
+
+
+-- End Observation Period Criteria
+
+) A on A.person_id = P.person_id
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id
+
+) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day')
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id
+) Results
+;
+ANALYZE Inclusion_9
+;
+
+CREATE TEMP TABLE Inclusion_10
+
+AS
+SELECT
+10 as inclusion_rule_id, person_id, event_id
+
+FROM
+(
+ select pe.person_id, pe.event_id
+ FROM qualified_events pe
+
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM qualified_events E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM qualified_events P
+INNER JOIN
+(
+ select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM (
+-- Begin Procedure Occurrence Criteria
+select C.person_id, C.procedure_occurrence_id as event_id, C.procedure_date as start_date, (C.procedure_date + 1*INTERVAL'1 day') as END_DATE,
+ C.procedure_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.procedure_date as sort_date
+from
+(
+ select po.* , row_number() over (PARTITION BY po.person_id ORDER BY po.procedure_date, po.procedure_occurrence_id) as ordinal
+ FROM cdm.PROCEDURE_OCCURRENCE po
+JOIN Codesets codesets on ((po.procedure_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.procedure_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.procedure_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.procedure_type_concept_id in (38000183,38000199)
+AND C.modifier_concept_id in (4000804,4001771)
+AND (C.quantity >= 0 and C.quantity <= 99)
+AND (EXTRACT(YEAR FROM C.procedure_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.procedure_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004446,38003627)
+AND V.visit_concept_id in (262,9201)
+AND C.ordinal = 1
+-- End Procedure Occurrence Criteria
+
+) PE
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Procedure Occurrence Criteria
+select C.person_id, C.procedure_occurrence_id as event_id, C.procedure_date as start_date, (C.procedure_date + 1*INTERVAL'1 day') as END_DATE,
+ C.procedure_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.procedure_date as sort_date
+from
+(
+ select po.* , row_number() over (PARTITION BY po.person_id ORDER BY po.procedure_date, po.procedure_occurrence_id) as ordinal
+ FROM cdm.PROCEDURE_OCCURRENCE po
+JOIN Codesets codesets on ((po.procedure_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.procedure_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.procedure_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.procedure_type_concept_id in (38000183,38000199)
+AND C.modifier_concept_id in (4000804,4001771)
+AND (C.quantity >= 0 and C.quantity <= 99)
+AND (EXTRACT(YEAR FROM C.procedure_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.procedure_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004446,38003627)
+AND V.visit_concept_id in (262,9201)
+AND C.ordinal = 1
+-- End Procedure Occurrence Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Procedure Occurrence Criteria
+select C.person_id, C.procedure_occurrence_id as event_id, C.procedure_date as start_date, (C.procedure_date + 1*INTERVAL'1 day') as END_DATE,
+ C.procedure_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.procedure_date as sort_date
+from
+(
+ select po.* , row_number() over (PARTITION BY po.person_id ORDER BY po.procedure_date, po.procedure_occurrence_id) as ordinal
+ FROM cdm.PROCEDURE_OCCURRENCE po
+JOIN Codesets codesets on ((po.procedure_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.procedure_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.procedure_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.procedure_type_concept_id in (38000183,38000199)
+AND C.modifier_concept_id in (4000804,4001771)
+AND (C.quantity >= 0 and C.quantity <= 99)
+AND (EXTRACT(YEAR FROM C.procedure_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.procedure_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004446,38003627)
+AND V.visit_concept_id in (262,9201)
+AND C.ordinal = 1
+-- End Procedure Occurrence Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) P
+INNER JOIN
+(
+ -- Begin Procedure Occurrence Criteria
+select C.person_id, C.procedure_occurrence_id as event_id, C.procedure_date as start_date, (C.procedure_date + 1*INTERVAL'1 day') as END_DATE,
+ C.procedure_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.procedure_date as sort_date
+from
+(
+ select po.*
+ FROM cdm.PROCEDURE_OCCURRENCE po
+JOIN Codesets codesets on ((po.procedure_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+
+
+-- End Procedure Occurrence Criteria
+
+) A on A.person_id = P.person_id AND A.visit_occurrence_id = P.visit_occurrence_id
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id
+
+) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day')
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id
+) Results
+;
+ANALYZE Inclusion_10
+;
+
+CREATE TEMP TABLE Inclusion_11
+
+AS
+SELECT
+11 as inclusion_rule_id, person_id, event_id
+
+FROM
+(
+ select pe.person_id, pe.event_id
+ FROM qualified_events pe
+
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM qualified_events E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM qualified_events P
+INNER JOIN
+(
+ select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM (
+-- Begin Specimen Criteria
+select C.person_id, C.specimen_id as event_id, C.specimen_date as start_date, (C.specimen_date + 1*INTERVAL'1 day') as end_date,
+ C.specimen_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.specimen_date as sort_date
+from
+(
+ select s.* , row_number() over (PARTITION BY s.person_id ORDER BY s.specimen_date, s.specimen_id) as ordinal
+ FROM cdm.SPECIMEN s
+where s.specimen_concept_id in (SELECT concept_id from Codesets where codeset_id = 0)
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE (C.specimen_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.specimen_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.specimen_type_concept_id in (38000183,38000199)
+AND (C.quantity >= 0.0000 and C.quantity <= 99.0000)
+AND C.unit_concept_id in (8688,9218)
+AND C.anatomic_site_concept_id in (4002601,4001422,4001433)
+AND C.disease_status_concept_id in (4066212)
+AND C.specimen_source_id like '%some sourceID%'
+AND (EXTRACT(YEAR FROM C.specimen_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.specimen_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND C.ordinal = 1
+-- End Specimen Criteria
+
+) PE
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Specimen Criteria
+select C.person_id, C.specimen_id as event_id, C.specimen_date as start_date, (C.specimen_date + 1*INTERVAL'1 day') as end_date,
+ C.specimen_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.specimen_date as sort_date
+from
+(
+ select s.* , row_number() over (PARTITION BY s.person_id ORDER BY s.specimen_date, s.specimen_id) as ordinal
+ FROM cdm.SPECIMEN s
+where s.specimen_concept_id in (SELECT concept_id from Codesets where codeset_id = 0)
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE (C.specimen_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.specimen_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.specimen_type_concept_id in (38000183,38000199)
+AND (C.quantity >= 0.0000 and C.quantity <= 99.0000)
+AND C.unit_concept_id in (8688,9218)
+AND C.anatomic_site_concept_id in (4002601,4001422,4001433)
+AND C.disease_status_concept_id in (4066212)
+AND C.specimen_source_id like '%some sourceID%'
+AND (EXTRACT(YEAR FROM C.specimen_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.specimen_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND C.ordinal = 1
+-- End Specimen Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Specimen Criteria
+select C.person_id, C.specimen_id as event_id, C.specimen_date as start_date, (C.specimen_date + 1*INTERVAL'1 day') as end_date,
+ C.specimen_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.specimen_date as sort_date
+from
+(
+ select s.* , row_number() over (PARTITION BY s.person_id ORDER BY s.specimen_date, s.specimen_id) as ordinal
+ FROM cdm.SPECIMEN s
+where s.specimen_concept_id in (SELECT concept_id from Codesets where codeset_id = 0)
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE (C.specimen_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.specimen_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.specimen_type_concept_id in (38000183,38000199)
+AND (C.quantity >= 0.0000 and C.quantity <= 99.0000)
+AND C.unit_concept_id in (8688,9218)
+AND C.anatomic_site_concept_id in (4002601,4001422,4001433)
+AND C.disease_status_concept_id in (4066212)
+AND C.specimen_source_id like '%some sourceID%'
+AND (EXTRACT(YEAR FROM C.specimen_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.specimen_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND C.ordinal = 1
+-- End Specimen Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) P
+INNER JOIN
+(
+ -- Begin Specimen Criteria
+select C.person_id, C.specimen_id as event_id, C.specimen_date as start_date, (C.specimen_date + 1*INTERVAL'1 day') as end_date,
+ C.specimen_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.specimen_date as sort_date
+from
+(
+ select s.*
+ FROM cdm.SPECIMEN s
+where s.specimen_concept_id in (SELECT concept_id from Codesets where codeset_id = 0)
+) C
+
+
+-- End Specimen Criteria
+
+) A on A.person_id = P.person_id
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id
+
+) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day')
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id
+) Results
+;
+ANALYZE Inclusion_11
+;
+
+CREATE TEMP TABLE Inclusion_12
+
+AS
+SELECT
+12 as inclusion_rule_id, person_id, event_id
+
+FROM
+(
+ select pe.person_id, pe.event_id
+ FROM qualified_events pe
+
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM qualified_events E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM qualified_events P
+INNER JOIN
+(
+ select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM (
+-- Begin Visit Occurrence Criteria
+select C.person_id, C.visit_occurrence_id as event_id, C.visit_start_date as start_date, C.visit_end_date as end_date,
+ C.visit_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.visit_start_date as sort_date
+from
+(
+ select vo.* , row_number() over (PARTITION BY vo.person_id ORDER BY vo.visit_start_date, vo.visit_occurrence_id) as ordinal
+ FROM cdm.VISIT_OCCURRENCE vo
+JOIN Codesets codesets on ((vo.visit_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (vo.visit_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.CARE_SITE CS on C.care_site_id = CS.care_site_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.visit_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.visit_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.visit_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.visit_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.visit_type_concept_id in (38000183,38000199)
+AND ((CAST(C.visit_end_date AS DATE) - CAST(C.visit_start_date AS DATE)) >= 0 and (CAST(C.visit_end_date AS DATE) - CAST(C.visit_start_date AS DATE)) <= 99)
+AND (EXTRACT(YEAR FROM C.visit_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.visit_start_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004446,38003627)
+AND CS.place_of_service_concept_id in (42628591,42628592)
+AND C.ordinal = 1
+-- End Visit Occurrence Criteria
+
+) PE
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Visit Occurrence Criteria
+select C.person_id, C.visit_occurrence_id as event_id, C.visit_start_date as start_date, C.visit_end_date as end_date,
+ C.visit_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.visit_start_date as sort_date
+from
+(
+ select vo.* , row_number() over (PARTITION BY vo.person_id ORDER BY vo.visit_start_date, vo.visit_occurrence_id) as ordinal
+ FROM cdm.VISIT_OCCURRENCE vo
+JOIN Codesets codesets on ((vo.visit_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (vo.visit_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.CARE_SITE CS on C.care_site_id = CS.care_site_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.visit_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.visit_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.visit_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.visit_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.visit_type_concept_id in (38000183,38000199)
+AND ((CAST(C.visit_end_date AS DATE) - CAST(C.visit_start_date AS DATE)) >= 0 and (CAST(C.visit_end_date AS DATE) - CAST(C.visit_start_date AS DATE)) <= 99)
+AND (EXTRACT(YEAR FROM C.visit_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.visit_start_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004446,38003627)
+AND CS.place_of_service_concept_id in (42628591,42628592)
+AND C.ordinal = 1
+-- End Visit Occurrence Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Visit Occurrence Criteria
+select C.person_id, C.visit_occurrence_id as event_id, C.visit_start_date as start_date, C.visit_end_date as end_date,
+ C.visit_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.visit_start_date as sort_date
+from
+(
+ select vo.* , row_number() over (PARTITION BY vo.person_id ORDER BY vo.visit_start_date, vo.visit_occurrence_id) as ordinal
+ FROM cdm.VISIT_OCCURRENCE vo
+JOIN Codesets codesets on ((vo.visit_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (vo.visit_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.CARE_SITE CS on C.care_site_id = CS.care_site_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.visit_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.visit_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.visit_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.visit_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.visit_type_concept_id in (38000183,38000199)
+AND ((CAST(C.visit_end_date AS DATE) - CAST(C.visit_start_date AS DATE)) >= 0 and (CAST(C.visit_end_date AS DATE) - CAST(C.visit_start_date AS DATE)) <= 99)
+AND (EXTRACT(YEAR FROM C.visit_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.visit_start_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004446,38003627)
+AND CS.place_of_service_concept_id in (42628591,42628592)
+AND C.ordinal = 1
+-- End Visit Occurrence Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) P
+INNER JOIN
+(
+ -- Begin Visit Occurrence Criteria
+select C.person_id, C.visit_occurrence_id as event_id, C.visit_start_date as start_date, C.visit_end_date as end_date,
+ C.visit_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.visit_start_date as sort_date
+from
+(
+ select vo.*
+ FROM cdm.VISIT_OCCURRENCE vo
+
+) C
+
+
+-- End Visit Occurrence Criteria
+
+) A on A.person_id = P.person_id AND A.visit_occurrence_id = P.visit_occurrence_id
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id
+
+) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day')
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id
+) Results
+;
+ANALYZE Inclusion_12
+;
+
+CREATE TEMP TABLE Inclusion_13
+
+AS
+SELECT
+13 as inclusion_rule_id, person_id, event_id
+
+FROM
+(
+ select pe.person_id, pe.event_id
+ FROM qualified_events pe
+
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM qualified_events E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM qualified_events P
+INNER JOIN
+(
+ -- Begin Condition Occurrence Criteria
+SELECT C.person_id, C.condition_occurrence_id as event_id, C.condition_start_date as start_date, COALESCE(C.condition_end_date, (C.condition_start_date + 1*INTERVAL'1 day')) as end_date,
+ C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.condition_start_date as sort_date
+FROM
+(
+ SELECT co.*
+ FROM cdm.CONDITION_OCCURRENCE co
+ JOIN Codesets codesets on ((co.condition_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+
+
+-- End Condition Occurrence Criteria
+
+) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -100*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 100*INTERVAL'1 day')
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+UNION ALL
+-- Begin Criteria Group
+select 1 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM qualified_events E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM qualified_events P
+INNER JOIN
+(
+ -- Begin Procedure Occurrence Criteria
+select C.person_id, C.procedure_occurrence_id as event_id, C.procedure_date as start_date, (C.procedure_date + 1*INTERVAL'1 day') as END_DATE,
+ C.procedure_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.procedure_date as sort_date
+from
+(
+ select po.*
+ FROM cdm.PROCEDURE_OCCURRENCE po
+JOIN Codesets codesets on ((po.procedure_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+
+
+-- End Procedure Occurrence Criteria
+
+) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -60*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 60*INTERVAL'1 day')
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+UNION ALL
+-- Begin Correlated Criteria
+SELECT 1 as index_id, p.person_id, p.event_id
+FROM qualified_events P
+INNER JOIN
+(
+ -- Begin Drug Exposure Criteria
+select C.person_id, C.drug_exposure_id as event_id, C.drug_exposure_start_date as start_date,
+ COALESCE(C.DRUG_EXPOSURE_END_DATE, (DRUG_EXPOSURE_START_DATE + C.DAYS_SUPPLY*INTERVAL'1 day'), (C.DRUG_EXPOSURE_START_DATE + 1*INTERVAL'1 day')) as end_date,
+ C.drug_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.drug_exposure_start_date as sort_date
+from
+(
+ select de.*
+ FROM cdm.DRUG_EXPOSURE de
+JOIN Codesets codesets on ((de.drug_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+
+
+-- End Drug Exposure Criteria
+
+) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day')
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) > 0
+) G
+-- End Criteria Group
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 2
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id
+) Results
+;
+ANALYZE Inclusion_13
+;
+
+CREATE TEMP TABLE inclusion_events
+
+AS
+SELECT
+inclusion_rule_id, person_id, event_id
+
+FROM
+(select inclusion_rule_id, person_id, event_id from Inclusion_0
+UNION ALL
+select inclusion_rule_id, person_id, event_id from Inclusion_1
+UNION ALL
+select inclusion_rule_id, person_id, event_id from Inclusion_2
+UNION ALL
+select inclusion_rule_id, person_id, event_id from Inclusion_3
+UNION ALL
+select inclusion_rule_id, person_id, event_id from Inclusion_4
+UNION ALL
+select inclusion_rule_id, person_id, event_id from Inclusion_5
+UNION ALL
+select inclusion_rule_id, person_id, event_id from Inclusion_6
+UNION ALL
+select inclusion_rule_id, person_id, event_id from Inclusion_7
+UNION ALL
+select inclusion_rule_id, person_id, event_id from Inclusion_8
+UNION ALL
+select inclusion_rule_id, person_id, event_id from Inclusion_9
+UNION ALL
+select inclusion_rule_id, person_id, event_id from Inclusion_10
+UNION ALL
+select inclusion_rule_id, person_id, event_id from Inclusion_11
+UNION ALL
+select inclusion_rule_id, person_id, event_id from Inclusion_12
+UNION ALL
+select inclusion_rule_id, person_id, event_id from Inclusion_13) I;
+ANALYZE inclusion_events
+;
+TRUNCATE TABLE Inclusion_0;
+DROP TABLE Inclusion_0;
+
+TRUNCATE TABLE Inclusion_1;
+DROP TABLE Inclusion_1;
+
+TRUNCATE TABLE Inclusion_2;
+DROP TABLE Inclusion_2;
+
+TRUNCATE TABLE Inclusion_3;
+DROP TABLE Inclusion_3;
+
+TRUNCATE TABLE Inclusion_4;
+DROP TABLE Inclusion_4;
+
+TRUNCATE TABLE Inclusion_5;
+DROP TABLE Inclusion_5;
+
+TRUNCATE TABLE Inclusion_6;
+DROP TABLE Inclusion_6;
+
+TRUNCATE TABLE Inclusion_7;
+DROP TABLE Inclusion_7;
+
+TRUNCATE TABLE Inclusion_8;
+DROP TABLE Inclusion_8;
+
+TRUNCATE TABLE Inclusion_9;
+DROP TABLE Inclusion_9;
+
+TRUNCATE TABLE Inclusion_10;
+DROP TABLE Inclusion_10;
+
+TRUNCATE TABLE Inclusion_11;
+DROP TABLE Inclusion_11;
+
+TRUNCATE TABLE Inclusion_12;
+DROP TABLE Inclusion_12;
+
+TRUNCATE TABLE Inclusion_13;
+DROP TABLE Inclusion_13;
+
+
+CREATE TEMP TABLE included_events
+
+AS
+WITH cteIncludedEvents(event_id, person_id, start_date, end_date, op_start_date, op_end_date, ordinal) AS (
+ SELECT event_id, person_id, start_date, end_date, op_start_date, op_end_date, row_number() over (partition by person_id order by start_date ASC) as ordinal
+ from
+ (
+ select Q.event_id, Q.person_id, Q.start_date, Q.end_date, Q.op_start_date, Q.op_end_date, SUM(coalesce(POWER(cast(2 as bigint), I.inclusion_rule_id), 0)) as inclusion_rule_mask
+ from qualified_events Q
+ LEFT JOIN inclusion_events I on I.person_id = Q.person_id and I.event_id = Q.event_id
+ GROUP BY Q.event_id, Q.person_id, Q.start_date, Q.end_date, Q.op_start_date, Q.op_end_date
+ ) MG -- matching groups
+
+ -- the matching group with all bits set ( POWER(2,# of inclusion rules) - 1 = inclusion_rule_mask
+ WHERE (MG.inclusion_rule_mask = POWER(cast(2 as bigint),14)-1)
+
+)
+ SELECT
+event_id, person_id, start_date, end_date, op_start_date, op_end_date
+
+FROM
+cteIncludedEvents Results
+WHERE Results.ordinal = 1
+;
+ANALYZE included_events
+;
+
+
+
+-- generate cohort periods into #final_cohort
+CREATE TEMP TABLE cohort_rows
+
+AS
+WITH cohort_ends (event_id, person_id, end_date) AS (
+ -- cohort exit dates
+ -- By default, cohort exit at the event's op end date
+select event_id, person_id, op_end_date as end_date from included_events
+),
+first_ends (person_id, start_date, end_date) as
+(
+ select F.person_id, F.start_date, F.end_date
+ FROM (
+ select I.event_id, I.person_id, I.start_date, E.end_date, row_number() over (partition by I.person_id, I.event_id order by E.end_date) as ordinal
+ from included_events I
+ join cohort_ends E on I.event_id = E.event_id and I.person_id = E.person_id and E.end_date >= I.start_date
+ ) F
+ WHERE F.ordinal = 1
+)
+ SELECT
+person_id, start_date, end_date
+
+FROM
+first_ends;
+ANALYZE cohort_rows
+;
+
+CREATE TEMP TABLE final_cohort
+
+AS
+WITH cteEndDates (person_id, end_date) AS (
+ SELECT
+ person_id
+ , (event_date + -1 * 0*INTERVAL'1 day') as end_date
+ FROM
+ (
+ SELECT
+ person_id
+ , event_date
+ , event_type
+ , MAX(start_ordinal) OVER (PARTITION BY person_id ORDER BY event_date, event_type ROWS UNBOUNDED PRECEDING) AS start_ordinal
+ , ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY event_date, event_type) AS overall_ord
+ FROM
+ (
+ SELECT
+ person_id
+ , start_date AS event_date
+ , -1 AS event_type
+ , ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY start_date) AS start_ordinal
+ FROM cohort_rows
+
+ UNION ALL
+
+
+ SELECT
+ person_id
+ , (end_date + 0*INTERVAL'1 day') as end_date
+ , 1 AS event_type
+ , NULL
+ FROM cohort_rows
+ ) RAWDATA
+ ) e
+ WHERE (2 * e.start_ordinal) - e.overall_ord = 0
+),
+cteEnds (person_id, start_date, end_date) AS
+(
+ SELECT
+ c.person_id
+ , c.start_date
+ , MIN(e.end_date) AS end_date
+ FROM cohort_rows c
+ JOIN cteEndDates e ON c.person_id = e.person_id AND e.end_date >= c.start_date
+ GROUP BY c.person_id, c.start_date
+)
+ SELECT
+person_id, min(start_date) as start_date, end_date
+
+FROM
+cteEnds
+group by person_id, end_date
+;
+ANALYZE final_cohort
+;
+
+DELETE FROM allCriteriaTest.cohort where cohort_definition_id = 1;
+INSERT INTO allCriteriaTest.cohort (cohort_definition_id, subject_id, cohort_start_date, cohort_end_date)
+select 1 as cohort_definition_id, person_id, start_date, end_date
+FROM final_cohort CO
+;
+
+
+-- Find the event that is the 'best match' per person.
+-- the 'best match' is defined as the event that satisfies the most inclusion rules.
+-- ties are solved by choosing the event that matches the earliest inclusion rule, and then earliest.
+
+CREATE TEMP TABLE best_events
+
+AS
+SELECT
+q.person_id, q.event_id
+
+FROM
+qualified_events Q
+join (
+ SELECT R.person_id, R.event_id, ROW_NUMBER() OVER (PARTITION BY R.person_id ORDER BY R.rule_count DESC,R.min_rule_id ASC, R.start_date ASC) AS rank_value
+ FROM (
+ SELECT Q.person_id, Q.event_id, COALESCE(COUNT(DISTINCT I.inclusion_rule_id), 0) AS rule_count, COALESCE(MIN(I.inclusion_rule_id), 0) AS min_rule_id, Q.start_date
+ FROM qualified_events Q
+ LEFT JOIN inclusion_events I ON q.person_id = i.person_id AND q.event_id = i.event_id
+ GROUP BY Q.person_id, Q.event_id, Q.start_date
+ ) R
+) ranked on Q.person_id = ranked.person_id and Q.event_id = ranked.event_id
+WHERE ranked.rank_value = 1
+;
+ANALYZE best_events
+;
+
+-- modes of generation: (the same tables store the results for the different modes, identified by the mode_id column)
+-- 0: all events
+-- 1: best event
+
+
+-- BEGIN: Inclusion Impact Analysis - event
+-- calculte matching group counts
+delete from allCriteriaTest.cohort_inclusion_result where cohort_definition_id = 1 and mode_id = 0;
+insert into allCriteriaTest.cohort_inclusion_result (cohort_definition_id, inclusion_rule_mask, person_count, mode_id)
+select 1 as cohort_definition_id, inclusion_rule_mask, COUNT(*) as person_count, 0 as mode_id
+from
+(
+ select Q.person_id, Q.event_id, CAST(SUM(coalesce(POWER(cast(2 as bigint), I.inclusion_rule_id), 0)) AS bigint) as inclusion_rule_mask
+ from qualified_events Q
+ LEFT JOIN inclusion_events I on q.person_id = i.person_id and q.event_id = i.event_id
+ GROUP BY Q.person_id, Q.event_id
+) MG -- matching groups
+group by inclusion_rule_mask
+;
+
+-- calculate gain counts
+delete from allCriteriaTest.cohort_inclusion_stats where cohort_definition_id = 1 and mode_id = 0;
+insert into allCriteriaTest.cohort_inclusion_stats (cohort_definition_id, rule_sequence, person_count, gain_count, person_total, mode_id)
+select ir.cohort_definition_id, ir.rule_sequence, coalesce(T.person_count, 0) as person_count, coalesce(SR.person_count, 0) gain_count, EventTotal.total, 0 as mode_id
+from allCriteriaTest.cohort_inclusion ir
+left join
+(
+ select i.inclusion_rule_id, COUNT(i.event_id) as person_count
+ from qualified_events Q
+ JOIN inclusion_events i on Q.person_id = I.person_id and Q.event_id = i.event_id
+ group by i.inclusion_rule_id
+) T on ir.rule_sequence = T.inclusion_rule_id
+CROSS JOIN (select count(*) as total_rules from allCriteriaTest.cohort_inclusion where cohort_definition_id = 1) RuleTotal
+CROSS JOIN (select COUNT(event_id) as total from qualified_events) EventTotal
+LEFT JOIN allCriteriaTest.cohort_inclusion_result SR on SR.mode_id = 0 AND SR.cohort_definition_id = 1 AND (POWER(cast(2 as bigint),RuleTotal.total_rules) - POWER(cast(2 as bigint),ir.rule_sequence) - 1) = SR.inclusion_rule_mask -- POWER(2,rule count) - POWER(2,rule sequence) - 1 is the mask for 'all except this rule'
+WHERE ir.cohort_definition_id = 1
+;
+
+-- calculate totals
+delete from allCriteriaTest.cohort_summary_stats where cohort_definition_id = 1 and mode_id = 0;
+insert into allCriteriaTest.cohort_summary_stats (cohort_definition_id, base_count, final_count, mode_id)
+select 1 as cohort_definition_id, PC.total as person_count, coalesce(FC.total, 0) as final_count, 0 as mode_id
+FROM
+(select COUNT(event_id) as total from qualified_events) PC,
+(select sum(sr.person_count) as total
+ from allCriteriaTest.cohort_inclusion_result sr
+ CROSS JOIN (select count(*) as total_rules from allCriteriaTest.cohort_inclusion where cohort_definition_id = 1) RuleTotal
+ where sr.mode_id = 0 and sr.cohort_definition_id = 1 and sr.inclusion_rule_mask = POWER(cast(2 as bigint),RuleTotal.total_rules)-1
+) FC
+;
+
+-- END: Inclusion Impact Analysis - event
+
+-- BEGIN: Inclusion Impact Analysis - person
+-- calculte matching group counts
+delete from allCriteriaTest.cohort_inclusion_result where cohort_definition_id = 1 and mode_id = 1;
+insert into allCriteriaTest.cohort_inclusion_result (cohort_definition_id, inclusion_rule_mask, person_count, mode_id)
+select 1 as cohort_definition_id, inclusion_rule_mask, COUNT(*) as person_count, 1 as mode_id
+from
+(
+ select Q.person_id, Q.event_id, CAST(SUM(coalesce(POWER(cast(2 as bigint), I.inclusion_rule_id), 0)) AS bigint) as inclusion_rule_mask
+ from best_events Q
+ LEFT JOIN inclusion_events I on q.person_id = i.person_id and q.event_id = i.event_id
+ GROUP BY Q.person_id, Q.event_id
+) MG -- matching groups
+group by inclusion_rule_mask
+;
+
+-- calculate gain counts
+delete from allCriteriaTest.cohort_inclusion_stats where cohort_definition_id = 1 and mode_id = 1;
+insert into allCriteriaTest.cohort_inclusion_stats (cohort_definition_id, rule_sequence, person_count, gain_count, person_total, mode_id)
+select ir.cohort_definition_id, ir.rule_sequence, coalesce(T.person_count, 0) as person_count, coalesce(SR.person_count, 0) gain_count, EventTotal.total, 1 as mode_id
+from allCriteriaTest.cohort_inclusion ir
+left join
+(
+ select i.inclusion_rule_id, COUNT(i.event_id) as person_count
+ from best_events Q
+ JOIN inclusion_events i on Q.person_id = I.person_id and Q.event_id = i.event_id
+ group by i.inclusion_rule_id
+) T on ir.rule_sequence = T.inclusion_rule_id
+CROSS JOIN (select count(*) as total_rules from allCriteriaTest.cohort_inclusion where cohort_definition_id = 1) RuleTotal
+CROSS JOIN (select COUNT(event_id) as total from best_events) EventTotal
+LEFT JOIN allCriteriaTest.cohort_inclusion_result SR on SR.mode_id = 1 AND SR.cohort_definition_id = 1 AND (POWER(cast(2 as bigint),RuleTotal.total_rules) - POWER(cast(2 as bigint),ir.rule_sequence) - 1) = SR.inclusion_rule_mask -- POWER(2,rule count) - POWER(2,rule sequence) - 1 is the mask for 'all except this rule'
+WHERE ir.cohort_definition_id = 1
+;
+
+-- calculate totals
+delete from allCriteriaTest.cohort_summary_stats where cohort_definition_id = 1 and mode_id = 1;
+insert into allCriteriaTest.cohort_summary_stats (cohort_definition_id, base_count, final_count, mode_id)
+select 1 as cohort_definition_id, PC.total as person_count, coalesce(FC.total, 0) as final_count, 1 as mode_id
+FROM
+(select COUNT(event_id) as total from best_events) PC,
+(select sum(sr.person_count) as total
+ from allCriteriaTest.cohort_inclusion_result sr
+ CROSS JOIN (select count(*) as total_rules from allCriteriaTest.cohort_inclusion where cohort_definition_id = 1) RuleTotal
+ where sr.mode_id = 1 and sr.cohort_definition_id = 1 and sr.inclusion_rule_mask = POWER(cast(2 as bigint),RuleTotal.total_rules)-1
+) FC
+;
+
+-- END: Inclusion Impact Analysis - person
+
+-- BEGIN: Censored Stats
+
+-- END: Censored Stats
+
+TRUNCATE TABLE best_events;
+DROP TABLE best_events;
+
+
+
+
+
+TRUNCATE TABLE cohort_rows;
+DROP TABLE cohort_rows;
+
+TRUNCATE TABLE final_cohort;
+DROP TABLE final_cohort;
+
+TRUNCATE TABLE inclusion_events;
+DROP TABLE inclusion_events;
+
+TRUNCATE TABLE qualified_events;
+DROP TABLE qualified_events;
+
+TRUNCATE TABLE included_events;
+DROP TABLE included_events;
+
+TRUNCATE TABLE Codesets;
+DROP TABLE Codesets;
diff --git a/~/cohort_sql.sql b/~/cohort_sql.sql
new file mode 100644
index 00000000..a5dd3819
--- /dev/null
+++ b/~/cohort_sql.sql
@@ -0,0 +1,2620 @@
+CREATE TEMP TABLE Codesets (codeset_id int NOT NULL,
+ concept_id bigint NOT NULL
+)
+;
+
+INSERT INTO Codesets (codeset_id, concept_id)
+SELECT 0 as codeset_id, c.concept_id FROM (select distinct I.concept_id FROM
+(
+ select concept_id from cdm.CONCEPT where 0=1
+) I
+) C
+;
+
+CREATE TEMP TABLE qualified_events
+
+AS
+WITH primary_events (event_id, person_id, start_date, end_date, op_start_date, op_end_date, visit_occurrence_id) AS (
+-- Begin Primary Events
+select P.ordinal as event_id, P.person_id, P.start_date, P.end_date, op_start_date, op_end_date, cast(P.visit_occurrence_id as bigint) as visit_occurrence_id
+FROM
+(
+ select E.person_id, E.start_date, E.end_date,
+ row_number() OVER (PARTITION BY E.person_id ORDER BY E.sort_date ASC) ordinal,
+ OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date, cast(E.visit_occurrence_id as bigint) as visit_occurrence_id
+ FROM
+ (
+ select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM (
+-- Begin Observation Period Criteria
+select C.person_id, C.observation_period_id as event_id, TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as start_date, TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as end_date,
+ C.period_type_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.observation_period_start_date as sort_date
+
+from
+(
+ select op.*, row_number() over (PARTITION BY op.person_id ORDER BY op.observation_period_start_date) as ordinal
+ FROM cdm.OBSERVATION_PERIOD op
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE C.ordinal = 1
+AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')
+AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')
+AND (C.observation_period_end_date >= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_end_date <= TO_DATE(TO_CHAR(2999,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.period_type_concept_id in (44814725,44787739)
+AND ((CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) >= 0 and (CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) <= 999)
+AND (EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth <= 99)
+AND (EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth <= 99)
+-- End Observation Period Criteria
+
+) PE
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Observation Period Criteria
+select C.person_id, C.observation_period_id as event_id, TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as start_date, TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as end_date,
+ C.period_type_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.observation_period_start_date as sort_date
+
+from
+(
+ select op.*, row_number() over (PARTITION BY op.person_id ORDER BY op.observation_period_start_date) as ordinal
+ FROM cdm.OBSERVATION_PERIOD op
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE C.ordinal = 1
+AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')
+AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')
+AND (C.observation_period_end_date >= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_end_date <= TO_DATE(TO_CHAR(2999,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.period_type_concept_id in (44814725,44787739)
+AND ((CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) >= 0 and (CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) <= 999)
+AND (EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth <= 99)
+AND (EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth <= 99)
+-- End Observation Period Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Observation Period Criteria
+select C.person_id, C.observation_period_id as event_id, TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as start_date, TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as end_date,
+ C.period_type_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.observation_period_start_date as sort_date
+
+from
+(
+ select op.*, row_number() over (PARTITION BY op.person_id ORDER BY op.observation_period_start_date) as ordinal
+ FROM cdm.OBSERVATION_PERIOD op
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE C.ordinal = 1
+AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')
+AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')
+AND (C.observation_period_end_date >= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_end_date <= TO_DATE(TO_CHAR(2999,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.period_type_concept_id in (44814725,44787739)
+AND ((CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) >= 0 and (CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) <= 999)
+AND (EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth <= 99)
+AND (EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth <= 99)
+-- End Observation Period Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) P
+INNER JOIN
+(
+ -- Begin Condition Occurrence Criteria
+SELECT C.person_id, C.condition_occurrence_id as event_id, C.condition_start_date as start_date, COALESCE(C.condition_end_date, (C.condition_start_date + 1*INTERVAL'1 day')) as end_date,
+ C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.condition_start_date as sort_date
+FROM
+(
+ SELECT co.*
+ FROM cdm.CONDITION_OCCURRENCE co
+
+) C
+
+
+-- End Condition Occurrence Criteria
+
+) A on A.person_id = P.person_id AND A.visit_occurrence_id = P.visit_occurrence_id
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id
+
+ ) E
+ JOIN cdm.observation_period OP on E.person_id = OP.person_id and E.start_date >= OP.observation_period_start_date and E.start_date <= op.observation_period_end_date
+ WHERE (OP.OBSERVATION_PERIOD_START_DATE + 0*INTERVAL'1 day') <= E.START_DATE AND (E.START_DATE + 0*INTERVAL'1 day') <= OP.OBSERVATION_PERIOD_END_DATE
+) P
+WHERE P.ordinal = 1
+-- End Primary Events
+
+)
+ SELECT
+event_id, person_id, start_date, end_date, op_start_date, op_end_date, visit_occurrence_id
+
+FROM
+(
+ select pe.event_id, pe.person_id, pe.start_date, pe.end_date, pe.op_start_date, pe.op_end_date, row_number() over (partition by pe.person_id order by pe.start_date ASC) as ordinal, cast(pe.visit_occurrence_id as bigint) as visit_occurrence_id
+ FROM primary_events pe
+
+) QE
+
+;
+ANALYZE qualified_events
+;
+
+--- Inclusion Rule Inserts
+
+CREATE TEMP TABLE Inclusion_0
+
+AS
+SELECT
+0 as inclusion_rule_id, person_id, event_id
+
+FROM
+(
+ select pe.person_id, pe.event_id
+ FROM qualified_events pe
+
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM qualified_events E
+ INNER JOIN
+ (
+ -- Begin Demographic Criteria
+SELECT 0 as index_id, e.person_id, e.event_id
+FROM qualified_events E
+JOIN cdm.PERSON P ON P.PERSON_ID = E.PERSON_ID
+WHERE (EXTRACT(YEAR FROM E.start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM E.start_date) - P.year_of_birth <= 99) AND P.gender_concept_id in (8507) AND P.race_concept_id in (8515,38003578) AND P.race_concept_id in (8515,38003578) AND P.ethnicity_concept_id in (38003564) AND (E.start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and E.start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) AND (E.end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and E.end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+GROUP BY e.person_id, e.event_id
+-- End Demographic Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id
+) Results
+;
+ANALYZE Inclusion_0
+;
+
+CREATE TEMP TABLE Inclusion_1
+
+AS
+SELECT
+1 as inclusion_rule_id, person_id, event_id
+
+FROM
+(
+ select pe.person_id, pe.event_id
+ FROM qualified_events pe
+
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM qualified_events E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM qualified_events P
+INNER JOIN
+(
+ select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM (
+-- Begin Condition Occurrence Criteria
+SELECT C.person_id, C.condition_occurrence_id as event_id, C.condition_start_date as start_date, COALESCE(C.condition_end_date, (C.condition_start_date + 1*INTERVAL'1 day')) as end_date,
+ C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.condition_start_date as sort_date
+FROM
+(
+ SELECT co.* , row_number() over (PARTITION BY co.person_id ORDER BY co.condition_start_date, co.condition_occurrence_id) as ordinal
+ FROM cdm.CONDITION_OCCURRENCE co
+ JOIN Codesets codesets on ((co.condition_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (co.condition_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.condition_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.condition_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.condition_type_concept_id in (38000199)
+AND C.stop_reason like '%this is some test text%'
+AND (EXTRACT(YEAR FROM C.condition_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_start_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8507)
+AND PR.specialty_concept_id in (45444755,45418395)
+AND V.visit_concept_id in (9201)
+AND C.ordinal = 1
+-- End Condition Occurrence Criteria
+
+) PE
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Condition Occurrence Criteria
+SELECT C.person_id, C.condition_occurrence_id as event_id, C.condition_start_date as start_date, COALESCE(C.condition_end_date, (C.condition_start_date + 1*INTERVAL'1 day')) as end_date,
+ C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.condition_start_date as sort_date
+FROM
+(
+ SELECT co.* , row_number() over (PARTITION BY co.person_id ORDER BY co.condition_start_date, co.condition_occurrence_id) as ordinal
+ FROM cdm.CONDITION_OCCURRENCE co
+ JOIN Codesets codesets on ((co.condition_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (co.condition_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.condition_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.condition_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.condition_type_concept_id in (38000199)
+AND C.stop_reason like '%this is some test text%'
+AND (EXTRACT(YEAR FROM C.condition_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_start_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8507)
+AND PR.specialty_concept_id in (45444755,45418395)
+AND V.visit_concept_id in (9201)
+AND C.ordinal = 1
+-- End Condition Occurrence Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Condition Occurrence Criteria
+SELECT C.person_id, C.condition_occurrence_id as event_id, C.condition_start_date as start_date, COALESCE(C.condition_end_date, (C.condition_start_date + 1*INTERVAL'1 day')) as end_date,
+ C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.condition_start_date as sort_date
+FROM
+(
+ SELECT co.* , row_number() over (PARTITION BY co.person_id ORDER BY co.condition_start_date, co.condition_occurrence_id) as ordinal
+ FROM cdm.CONDITION_OCCURRENCE co
+ JOIN Codesets codesets on ((co.condition_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (co.condition_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.condition_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.condition_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.condition_type_concept_id in (38000199)
+AND C.stop_reason like '%this is some test text%'
+AND (EXTRACT(YEAR FROM C.condition_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_start_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8507)
+AND PR.specialty_concept_id in (45444755,45418395)
+AND V.visit_concept_id in (9201)
+AND C.ordinal = 1
+-- End Condition Occurrence Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) P
+INNER JOIN
+(
+ -- Begin Condition Occurrence Criteria
+SELECT C.person_id, C.condition_occurrence_id as event_id, C.condition_start_date as start_date, COALESCE(C.condition_end_date, (C.condition_start_date + 1*INTERVAL'1 day')) as end_date,
+ C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.condition_start_date as sort_date
+FROM
+(
+ SELECT co.*
+ FROM cdm.CONDITION_OCCURRENCE co
+
+) C
+
+
+-- End Condition Occurrence Criteria
+
+) A on A.person_id = P.person_id AND A.visit_occurrence_id = P.visit_occurrence_id
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id
+
+) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day')
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id
+) Results
+;
+ANALYZE Inclusion_1
+;
+
+CREATE TEMP TABLE Inclusion_2
+
+AS
+SELECT
+2 as inclusion_rule_id, person_id, event_id
+
+FROM
+(
+ select pe.person_id, pe.event_id
+ FROM qualified_events pe
+
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM qualified_events E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM qualified_events P
+INNER JOIN
+(
+ select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM (
+-- Begin Condition Era Criteria
+select C.person_id, C.condition_era_id as event_id, C.condition_era_start_date as start_date,
+ C.condition_era_end_date as end_date, C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.condition_era_start_date as sort_date
+from
+(
+ select ce.* , row_number() over (PARTITION BY ce.person_id ORDER BY ce.condition_era_start_date, ce.condition_era_id) as ordinal
+ FROM cdm.CONDITION_ERA ce
+where ce.condition_concept_id in (SELECT concept_id from Codesets where codeset_id = 0)
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE (C.condition_era_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_era_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.condition_era_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_era_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.condition_occurrence_count >= 0 and C.condition_occurrence_count <= 99)
+AND ((CAST(C.condition_era_end_date AS DATE) - CAST(C.condition_era_start_date AS DATE)) >= 0 and (CAST(C.condition_era_end_date AS DATE) - CAST(C.condition_era_start_date AS DATE)) <= 99)
+AND (EXTRACT(YEAR FROM C.condition_era_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_era_start_date) - P.year_of_birth <= 99)
+AND (EXTRACT(YEAR FROM C.condition_era_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_era_end_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8507)
+AND C.ordinal = 1
+-- End Condition Era Criteria
+
+) PE
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Condition Era Criteria
+select C.person_id, C.condition_era_id as event_id, C.condition_era_start_date as start_date,
+ C.condition_era_end_date as end_date, C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.condition_era_start_date as sort_date
+from
+(
+ select ce.* , row_number() over (PARTITION BY ce.person_id ORDER BY ce.condition_era_start_date, ce.condition_era_id) as ordinal
+ FROM cdm.CONDITION_ERA ce
+where ce.condition_concept_id in (SELECT concept_id from Codesets where codeset_id = 0)
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE (C.condition_era_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_era_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.condition_era_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_era_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.condition_occurrence_count >= 0 and C.condition_occurrence_count <= 99)
+AND ((CAST(C.condition_era_end_date AS DATE) - CAST(C.condition_era_start_date AS DATE)) >= 0 and (CAST(C.condition_era_end_date AS DATE) - CAST(C.condition_era_start_date AS DATE)) <= 99)
+AND (EXTRACT(YEAR FROM C.condition_era_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_era_start_date) - P.year_of_birth <= 99)
+AND (EXTRACT(YEAR FROM C.condition_era_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_era_end_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8507)
+AND C.ordinal = 1
+-- End Condition Era Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Condition Era Criteria
+select C.person_id, C.condition_era_id as event_id, C.condition_era_start_date as start_date,
+ C.condition_era_end_date as end_date, C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.condition_era_start_date as sort_date
+from
+(
+ select ce.* , row_number() over (PARTITION BY ce.person_id ORDER BY ce.condition_era_start_date, ce.condition_era_id) as ordinal
+ FROM cdm.CONDITION_ERA ce
+where ce.condition_concept_id in (SELECT concept_id from Codesets where codeset_id = 0)
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE (C.condition_era_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_era_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.condition_era_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_era_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.condition_occurrence_count >= 0 and C.condition_occurrence_count <= 99)
+AND ((CAST(C.condition_era_end_date AS DATE) - CAST(C.condition_era_start_date AS DATE)) >= 0 and (CAST(C.condition_era_end_date AS DATE) - CAST(C.condition_era_start_date AS DATE)) <= 99)
+AND (EXTRACT(YEAR FROM C.condition_era_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_era_start_date) - P.year_of_birth <= 99)
+AND (EXTRACT(YEAR FROM C.condition_era_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_era_end_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8507)
+AND C.ordinal = 1
+-- End Condition Era Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) P
+INNER JOIN
+(
+ -- Begin Condition Era Criteria
+select C.person_id, C.condition_era_id as event_id, C.condition_era_start_date as start_date,
+ C.condition_era_end_date as end_date, C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.condition_era_start_date as sort_date
+from
+(
+ select ce.*
+ FROM cdm.CONDITION_ERA ce
+
+) C
+
+
+-- End Condition Era Criteria
+
+) A on A.person_id = P.person_id
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id
+
+) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day')
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id
+) Results
+;
+ANALYZE Inclusion_2
+;
+
+CREATE TEMP TABLE Inclusion_3
+
+AS
+SELECT
+3 as inclusion_rule_id, person_id, event_id
+
+FROM
+(
+ select pe.person_id, pe.event_id
+ FROM qualified_events pe
+
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM qualified_events E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM qualified_events P
+INNER JOIN
+(
+ select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM (
+-- Begin Death Criteria
+select C.person_id, C.person_id as event_id, C.death_date as start_date, (C.death_date + 1*INTERVAL'1 day') as end_date,
+ coalesce(C.cause_concept_id,0) as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.death_date as sort_date
+from
+(
+ select d.*
+ FROM cdm.DEATH d
+JOIN Codesets codesets on ((d.cause_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE (C.death_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.death_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.death_type_concept_id in (256,255,254)
+AND (EXTRACT(YEAR FROM C.death_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.death_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+-- End Death Criteria
+
+
+) PE
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Death Criteria
+select C.person_id, C.person_id as event_id, C.death_date as start_date, (C.death_date + 1*INTERVAL'1 day') as end_date,
+ coalesce(C.cause_concept_id,0) as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.death_date as sort_date
+from
+(
+ select d.*
+ FROM cdm.DEATH d
+JOIN Codesets codesets on ((d.cause_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE (C.death_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.death_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.death_type_concept_id in (256,255,254)
+AND (EXTRACT(YEAR FROM C.death_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.death_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+-- End Death Criteria
+
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Death Criteria
+select C.person_id, C.person_id as event_id, C.death_date as start_date, (C.death_date + 1*INTERVAL'1 day') as end_date,
+ coalesce(C.cause_concept_id,0) as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.death_date as sort_date
+from
+(
+ select d.*
+ FROM cdm.DEATH d
+JOIN Codesets codesets on ((d.cause_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE (C.death_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.death_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.death_type_concept_id in (256,255,254)
+AND (EXTRACT(YEAR FROM C.death_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.death_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+-- End Death Criteria
+
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) P
+INNER JOIN
+(
+ -- Begin Death Criteria
+select C.person_id, C.person_id as event_id, C.death_date as start_date, (C.death_date + 1*INTERVAL'1 day') as end_date,
+ coalesce(C.cause_concept_id,0) as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.death_date as sort_date
+from
+(
+ select d.*
+ FROM cdm.DEATH d
+JOIN Codesets codesets on ((d.cause_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+
+
+-- End Death Criteria
+
+
+) A on A.person_id = P.person_id
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id
+
+) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day')
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id
+) Results
+;
+ANALYZE Inclusion_3
+;
+
+CREATE TEMP TABLE Inclusion_4
+
+AS
+SELECT
+4 as inclusion_rule_id, person_id, event_id
+
+FROM
+(
+ select pe.person_id, pe.event_id
+ FROM qualified_events pe
+
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM qualified_events E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM qualified_events P
+INNER JOIN
+(
+ select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM (
+-- Begin Device Exposure Criteria
+select C.person_id, C.device_exposure_id as event_id, C.device_exposure_start_date as start_date, C.device_exposure_end_date as end_date,
+ C.device_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.device_exposure_start_date as sort_date
+from
+(
+ select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.device_exposure_start_date, de.device_exposure_id) as ordinal
+ FROM cdm.DEVICE_EXPOSURE de
+JOIN Codesets codesets on ((de.device_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (de.device_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.device_exposure_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.device_exposure_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.device_exposure_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.device_exposure_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.device_type_concept_id in (32465,44818706)
+AND C.unique_device_id like '%null%'
+AND (C.quantity >= 0 and C.quantity <= 99)
+AND (EXTRACT(YEAR FROM C.device_exposure_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.device_exposure_start_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004455,38003625,38003626)
+AND V.visit_concept_id in (8717,8756)
+AND C.ordinal = 1
+-- End Device Exposure Criteria
+
+) PE
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Device Exposure Criteria
+select C.person_id, C.device_exposure_id as event_id, C.device_exposure_start_date as start_date, C.device_exposure_end_date as end_date,
+ C.device_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.device_exposure_start_date as sort_date
+from
+(
+ select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.device_exposure_start_date, de.device_exposure_id) as ordinal
+ FROM cdm.DEVICE_EXPOSURE de
+JOIN Codesets codesets on ((de.device_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (de.device_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.device_exposure_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.device_exposure_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.device_exposure_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.device_exposure_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.device_type_concept_id in (32465,44818706)
+AND C.unique_device_id like '%null%'
+AND (C.quantity >= 0 and C.quantity <= 99)
+AND (EXTRACT(YEAR FROM C.device_exposure_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.device_exposure_start_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004455,38003625,38003626)
+AND V.visit_concept_id in (8717,8756)
+AND C.ordinal = 1
+-- End Device Exposure Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Device Exposure Criteria
+select C.person_id, C.device_exposure_id as event_id, C.device_exposure_start_date as start_date, C.device_exposure_end_date as end_date,
+ C.device_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.device_exposure_start_date as sort_date
+from
+(
+ select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.device_exposure_start_date, de.device_exposure_id) as ordinal
+ FROM cdm.DEVICE_EXPOSURE de
+JOIN Codesets codesets on ((de.device_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (de.device_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.device_exposure_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.device_exposure_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.device_exposure_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.device_exposure_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.device_type_concept_id in (32465,44818706)
+AND C.unique_device_id like '%null%'
+AND (C.quantity >= 0 and C.quantity <= 99)
+AND (EXTRACT(YEAR FROM C.device_exposure_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.device_exposure_start_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004455,38003625,38003626)
+AND V.visit_concept_id in (8717,8756)
+AND C.ordinal = 1
+-- End Device Exposure Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) P
+INNER JOIN
+(
+ -- Begin Device Exposure Criteria
+select C.person_id, C.device_exposure_id as event_id, C.device_exposure_start_date as start_date, C.device_exposure_end_date as end_date,
+ C.device_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.device_exposure_start_date as sort_date
+from
+(
+ select de.*
+ FROM cdm.DEVICE_EXPOSURE de
+JOIN Codesets codesets on ((de.device_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+
+
+-- End Device Exposure Criteria
+
+) A on A.person_id = P.person_id AND A.visit_occurrence_id = P.visit_occurrence_id
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id
+
+) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day')
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id
+) Results
+;
+ANALYZE Inclusion_4
+;
+
+CREATE TEMP TABLE Inclusion_5
+
+AS
+SELECT
+5 as inclusion_rule_id, person_id, event_id
+
+FROM
+(
+ select pe.person_id, pe.event_id
+ FROM qualified_events pe
+
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM qualified_events E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM qualified_events P
+INNER JOIN
+(
+ select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM (
+-- Begin Drug Era Criteria
+select C.person_id, C.drug_era_id as event_id, C.drug_era_start_date as start_date, C.drug_era_end_date as end_date,
+ C.drug_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.drug_era_start_date as sort_date
+from
+(
+ select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.drug_era_start_date, de.drug_era_id) as ordinal
+ FROM cdm.DRUG_ERA de
+
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE (C.drug_era_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_era_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.drug_era_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_era_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.drug_exposure_count >= 0 and C.drug_exposure_count <= 99)
+AND ((CAST(C.drug_era_end_date AS DATE) - CAST(C.drug_era_start_date AS DATE)) >= 0 and (CAST(C.drug_era_end_date AS DATE) - CAST(C.drug_era_start_date AS DATE)) <= 99)
+AND (EXTRACT(YEAR FROM C.drug_era_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_era_start_date) - P.year_of_birth <= 99)
+AND (EXTRACT(YEAR FROM C.drug_era_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_era_end_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND C.ordinal = 1
+-- End Drug Era Criteria
+
+) PE
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Drug Era Criteria
+select C.person_id, C.drug_era_id as event_id, C.drug_era_start_date as start_date, C.drug_era_end_date as end_date,
+ C.drug_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.drug_era_start_date as sort_date
+from
+(
+ select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.drug_era_start_date, de.drug_era_id) as ordinal
+ FROM cdm.DRUG_ERA de
+
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE (C.drug_era_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_era_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.drug_era_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_era_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.drug_exposure_count >= 0 and C.drug_exposure_count <= 99)
+AND ((CAST(C.drug_era_end_date AS DATE) - CAST(C.drug_era_start_date AS DATE)) >= 0 and (CAST(C.drug_era_end_date AS DATE) - CAST(C.drug_era_start_date AS DATE)) <= 99)
+AND (EXTRACT(YEAR FROM C.drug_era_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_era_start_date) - P.year_of_birth <= 99)
+AND (EXTRACT(YEAR FROM C.drug_era_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_era_end_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND C.ordinal = 1
+-- End Drug Era Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Drug Era Criteria
+select C.person_id, C.drug_era_id as event_id, C.drug_era_start_date as start_date, C.drug_era_end_date as end_date,
+ C.drug_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.drug_era_start_date as sort_date
+from
+(
+ select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.drug_era_start_date, de.drug_era_id) as ordinal
+ FROM cdm.DRUG_ERA de
+
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE (C.drug_era_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_era_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.drug_era_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_era_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.drug_exposure_count >= 0 and C.drug_exposure_count <= 99)
+AND ((CAST(C.drug_era_end_date AS DATE) - CAST(C.drug_era_start_date AS DATE)) >= 0 and (CAST(C.drug_era_end_date AS DATE) - CAST(C.drug_era_start_date AS DATE)) <= 99)
+AND (EXTRACT(YEAR FROM C.drug_era_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_era_start_date) - P.year_of_birth <= 99)
+AND (EXTRACT(YEAR FROM C.drug_era_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_era_end_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND C.ordinal = 1
+-- End Drug Era Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) P
+INNER JOIN
+(
+ -- Begin Drug Era Criteria
+select C.person_id, C.drug_era_id as event_id, C.drug_era_start_date as start_date, C.drug_era_end_date as end_date,
+ C.drug_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.drug_era_start_date as sort_date
+from
+(
+ select de.*
+ FROM cdm.DRUG_ERA de
+where de.drug_concept_id in (SELECT concept_id from Codesets where codeset_id = 0)
+) C
+
+
+-- End Drug Era Criteria
+
+) A on A.person_id = P.person_id
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id
+
+) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day')
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id
+) Results
+;
+ANALYZE Inclusion_5
+;
+
+CREATE TEMP TABLE Inclusion_6
+
+AS
+SELECT
+6 as inclusion_rule_id, person_id, event_id
+
+FROM
+(
+ select pe.person_id, pe.event_id
+ FROM qualified_events pe
+
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM qualified_events E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM qualified_events P
+INNER JOIN
+(
+ select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM (
+-- Begin Drug Exposure Criteria
+select C.person_id, C.drug_exposure_id as event_id, C.drug_exposure_start_date as start_date,
+ COALESCE(C.DRUG_EXPOSURE_END_DATE, (DRUG_EXPOSURE_START_DATE + C.DAYS_SUPPLY*INTERVAL'1 day'), (C.DRUG_EXPOSURE_START_DATE + 1*INTERVAL'1 day')) as end_date,
+ C.drug_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.drug_exposure_start_date as sort_date
+from
+(
+ select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.drug_exposure_start_date, de.drug_exposure_id) as ordinal
+ FROM cdm.DRUG_EXPOSURE de
+JOIN Codesets codesets on ((de.drug_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (de.drug_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.drug_exposure_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_exposure_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.drug_exposure_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_exposure_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.drug_type_concept_id in (38000175,38000176)
+AND C.stop_reason like '%stop reason%'
+AND (C.refills >= 0 and C.refills <= 99)
+AND (C.quantity >= 0.0000 and C.quantity <= 99.0000)
+AND (C.days_supply >= 0 and C.days_supply <= 99)
+AND C.route_concept_id in (4263689,4023156,4006860)
+AND (C.effective_drug_dose >= 0.0000 and C.effective_drug_dose <= 99.0000)
+AND C.dose_unit_concept_id in (8554,8849,9214)
+AND C.lot_number like '%lot number%'
+AND (EXTRACT(YEAR FROM C.drug_exposure_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_exposure_start_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004446,38003625)
+AND V.visit_concept_id in (262,9201)
+AND C.ordinal = 1
+-- End Drug Exposure Criteria
+
+) PE
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Drug Exposure Criteria
+select C.person_id, C.drug_exposure_id as event_id, C.drug_exposure_start_date as start_date,
+ COALESCE(C.DRUG_EXPOSURE_END_DATE, (DRUG_EXPOSURE_START_DATE + C.DAYS_SUPPLY*INTERVAL'1 day'), (C.DRUG_EXPOSURE_START_DATE + 1*INTERVAL'1 day')) as end_date,
+ C.drug_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.drug_exposure_start_date as sort_date
+from
+(
+ select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.drug_exposure_start_date, de.drug_exposure_id) as ordinal
+ FROM cdm.DRUG_EXPOSURE de
+JOIN Codesets codesets on ((de.drug_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (de.drug_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.drug_exposure_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_exposure_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.drug_exposure_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_exposure_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.drug_type_concept_id in (38000175,38000176)
+AND C.stop_reason like '%stop reason%'
+AND (C.refills >= 0 and C.refills <= 99)
+AND (C.quantity >= 0.0000 and C.quantity <= 99.0000)
+AND (C.days_supply >= 0 and C.days_supply <= 99)
+AND C.route_concept_id in (4263689,4023156,4006860)
+AND (C.effective_drug_dose >= 0.0000 and C.effective_drug_dose <= 99.0000)
+AND C.dose_unit_concept_id in (8554,8849,9214)
+AND C.lot_number like '%lot number%'
+AND (EXTRACT(YEAR FROM C.drug_exposure_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_exposure_start_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004446,38003625)
+AND V.visit_concept_id in (262,9201)
+AND C.ordinal = 1
+-- End Drug Exposure Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Drug Exposure Criteria
+select C.person_id, C.drug_exposure_id as event_id, C.drug_exposure_start_date as start_date,
+ COALESCE(C.DRUG_EXPOSURE_END_DATE, (DRUG_EXPOSURE_START_DATE + C.DAYS_SUPPLY*INTERVAL'1 day'), (C.DRUG_EXPOSURE_START_DATE + 1*INTERVAL'1 day')) as end_date,
+ C.drug_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.drug_exposure_start_date as sort_date
+from
+(
+ select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.drug_exposure_start_date, de.drug_exposure_id) as ordinal
+ FROM cdm.DRUG_EXPOSURE de
+JOIN Codesets codesets on ((de.drug_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (de.drug_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.drug_exposure_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_exposure_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.drug_exposure_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_exposure_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.drug_type_concept_id in (38000175,38000176)
+AND C.stop_reason like '%stop reason%'
+AND (C.refills >= 0 and C.refills <= 99)
+AND (C.quantity >= 0.0000 and C.quantity <= 99.0000)
+AND (C.days_supply >= 0 and C.days_supply <= 99)
+AND C.route_concept_id in (4263689,4023156,4006860)
+AND (C.effective_drug_dose >= 0.0000 and C.effective_drug_dose <= 99.0000)
+AND C.dose_unit_concept_id in (8554,8849,9214)
+AND C.lot_number like '%lot number%'
+AND (EXTRACT(YEAR FROM C.drug_exposure_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_exposure_start_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004446,38003625)
+AND V.visit_concept_id in (262,9201)
+AND C.ordinal = 1
+-- End Drug Exposure Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) P
+INNER JOIN
+(
+ -- Begin Drug Exposure Criteria
+select C.person_id, C.drug_exposure_id as event_id, C.drug_exposure_start_date as start_date,
+ COALESCE(C.DRUG_EXPOSURE_END_DATE, (DRUG_EXPOSURE_START_DATE + C.DAYS_SUPPLY*INTERVAL'1 day'), (C.DRUG_EXPOSURE_START_DATE + 1*INTERVAL'1 day')) as end_date,
+ C.drug_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.drug_exposure_start_date as sort_date
+from
+(
+ select de.*
+ FROM cdm.DRUG_EXPOSURE de
+
+) C
+
+
+-- End Drug Exposure Criteria
+
+) A on A.person_id = P.person_id AND A.visit_occurrence_id = P.visit_occurrence_id
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id
+
+) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day')
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id
+) Results
+;
+ANALYZE Inclusion_6
+;
+
+CREATE TEMP TABLE Inclusion_7
+
+AS
+SELECT
+7 as inclusion_rule_id, person_id, event_id
+
+FROM
+(
+ select pe.person_id, pe.event_id
+ FROM qualified_events pe
+
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM qualified_events E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM qualified_events P
+INNER JOIN
+(
+ select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM (
+-- Begin Measurement Criteria
+select C.person_id, C.measurement_id as event_id, C.measurement_date as start_date, (C.measurement_date + 1*INTERVAL'1 day') as END_DATE,
+ C.measurement_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.measurement_date as sort_date
+from
+(
+ select m.* , row_number() over (PARTITION BY m.person_id ORDER BY m.measurement_date, m.measurement_id) as ordinal
+ FROM cdm.MEASUREMENT m
+JOIN Codesets codesets on ((m.measurement_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.measurement_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.measurement_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.measurement_type_concept_id in (38000183,38000199)
+AND C.operator_concept_id in (4172704)
+AND (C.value_as_number >= 0.0000 and C.value_as_number <= 99.0000)
+AND C.value_as_concept_id in (9191)
+AND C.unit_concept_id in (9256)
+AND (C.range_low >= 0.0000 and C.range_low <= 99.0000)
+AND (C.range_high >= 0.0000 and C.range_high <= 99.0000)
+AND ((C.value_as_number / NULLIF(C.range_low, 0)) >= 0.0000 and (C.value_as_number / NULLIF(C.range_low, 0)) <= 99.0000)
+AND ((C.value_as_number / NULLIF(C.range_high, 0)) >= 0.0000 and (C.value_as_number / NULLIF(C.range_high, 0)) <= 99.0000)
+AND (C.value_as_number < C.range_low or C.value_as_number > C.range_high or C.value_as_concept_id in (4155142, 4155143))
+AND (EXTRACT(YEAR FROM C.measurement_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.measurement_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004446,38003626,38003627)
+AND V.visit_concept_id in (262,9201)
+AND C.ordinal = 1
+-- End Measurement Criteria
+
+) PE
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Measurement Criteria
+select C.person_id, C.measurement_id as event_id, C.measurement_date as start_date, (C.measurement_date + 1*INTERVAL'1 day') as END_DATE,
+ C.measurement_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.measurement_date as sort_date
+from
+(
+ select m.* , row_number() over (PARTITION BY m.person_id ORDER BY m.measurement_date, m.measurement_id) as ordinal
+ FROM cdm.MEASUREMENT m
+JOIN Codesets codesets on ((m.measurement_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.measurement_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.measurement_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.measurement_type_concept_id in (38000183,38000199)
+AND C.operator_concept_id in (4172704)
+AND (C.value_as_number >= 0.0000 and C.value_as_number <= 99.0000)
+AND C.value_as_concept_id in (9191)
+AND C.unit_concept_id in (9256)
+AND (C.range_low >= 0.0000 and C.range_low <= 99.0000)
+AND (C.range_high >= 0.0000 and C.range_high <= 99.0000)
+AND ((C.value_as_number / NULLIF(C.range_low, 0)) >= 0.0000 and (C.value_as_number / NULLIF(C.range_low, 0)) <= 99.0000)
+AND ((C.value_as_number / NULLIF(C.range_high, 0)) >= 0.0000 and (C.value_as_number / NULLIF(C.range_high, 0)) <= 99.0000)
+AND (C.value_as_number < C.range_low or C.value_as_number > C.range_high or C.value_as_concept_id in (4155142, 4155143))
+AND (EXTRACT(YEAR FROM C.measurement_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.measurement_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004446,38003626,38003627)
+AND V.visit_concept_id in (262,9201)
+AND C.ordinal = 1
+-- End Measurement Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Measurement Criteria
+select C.person_id, C.measurement_id as event_id, C.measurement_date as start_date, (C.measurement_date + 1*INTERVAL'1 day') as END_DATE,
+ C.measurement_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.measurement_date as sort_date
+from
+(
+ select m.* , row_number() over (PARTITION BY m.person_id ORDER BY m.measurement_date, m.measurement_id) as ordinal
+ FROM cdm.MEASUREMENT m
+JOIN Codesets codesets on ((m.measurement_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.measurement_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.measurement_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.measurement_type_concept_id in (38000183,38000199)
+AND C.operator_concept_id in (4172704)
+AND (C.value_as_number >= 0.0000 and C.value_as_number <= 99.0000)
+AND C.value_as_concept_id in (9191)
+AND C.unit_concept_id in (9256)
+AND (C.range_low >= 0.0000 and C.range_low <= 99.0000)
+AND (C.range_high >= 0.0000 and C.range_high <= 99.0000)
+AND ((C.value_as_number / NULLIF(C.range_low, 0)) >= 0.0000 and (C.value_as_number / NULLIF(C.range_low, 0)) <= 99.0000)
+AND ((C.value_as_number / NULLIF(C.range_high, 0)) >= 0.0000 and (C.value_as_number / NULLIF(C.range_high, 0)) <= 99.0000)
+AND (C.value_as_number < C.range_low or C.value_as_number > C.range_high or C.value_as_concept_id in (4155142, 4155143))
+AND (EXTRACT(YEAR FROM C.measurement_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.measurement_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004446,38003626,38003627)
+AND V.visit_concept_id in (262,9201)
+AND C.ordinal = 1
+-- End Measurement Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) P
+INNER JOIN
+(
+ -- Begin Measurement Criteria
+select C.person_id, C.measurement_id as event_id, C.measurement_date as start_date, (C.measurement_date + 1*INTERVAL'1 day') as END_DATE,
+ C.measurement_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.measurement_date as sort_date
+from
+(
+ select m.*
+ FROM cdm.MEASUREMENT m
+JOIN Codesets codesets on ((m.measurement_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+
+
+-- End Measurement Criteria
+
+) A on A.person_id = P.person_id AND A.visit_occurrence_id = P.visit_occurrence_id
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id
+
+) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day')
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id
+) Results
+;
+ANALYZE Inclusion_7
+;
+
+CREATE TEMP TABLE Inclusion_8
+
+AS
+SELECT
+8 as inclusion_rule_id, person_id, event_id
+
+FROM
+(
+ select pe.person_id, pe.event_id
+ FROM qualified_events pe
+
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM qualified_events E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM qualified_events P
+INNER JOIN
+(
+ select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM (
+-- Begin Observation Criteria
+select C.person_id, C.observation_id as event_id, C.observation_date as start_date, (C.observation_date + 1*INTERVAL'1 day') as END_DATE,
+ C.observation_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.observation_date as sort_date
+from
+(
+ select o.* , row_number() over (PARTITION BY o.person_id ORDER BY o.observation_date, o.observation_id) as ordinal
+ FROM cdm.OBSERVATION o
+JOIN Codesets codesets on ((o.observation_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (o.observation_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.observation_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.observation_type_concept_id in (38000183,38000199)
+AND (C.value_as_number >= 0.0000 and C.value_as_number <= 99.0000)
+AND C.value_as_string like '%some value%'
+AND C.value_as_concept_id in (36312355)
+AND C.qualifier_concept_id in (4172703,4171754)
+AND C.unit_concept_id in (8554)
+AND (EXTRACT(YEAR FROM C.observation_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004446,38003627)
+AND V.visit_concept_id in (262,9201)
+AND C.ordinal = 1
+-- End Observation Criteria
+
+) PE
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Observation Criteria
+select C.person_id, C.observation_id as event_id, C.observation_date as start_date, (C.observation_date + 1*INTERVAL'1 day') as END_DATE,
+ C.observation_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.observation_date as sort_date
+from
+(
+ select o.* , row_number() over (PARTITION BY o.person_id ORDER BY o.observation_date, o.observation_id) as ordinal
+ FROM cdm.OBSERVATION o
+JOIN Codesets codesets on ((o.observation_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (o.observation_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.observation_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.observation_type_concept_id in (38000183,38000199)
+AND (C.value_as_number >= 0.0000 and C.value_as_number <= 99.0000)
+AND C.value_as_string like '%some value%'
+AND C.value_as_concept_id in (36312355)
+AND C.qualifier_concept_id in (4172703,4171754)
+AND C.unit_concept_id in (8554)
+AND (EXTRACT(YEAR FROM C.observation_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004446,38003627)
+AND V.visit_concept_id in (262,9201)
+AND C.ordinal = 1
+-- End Observation Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Observation Criteria
+select C.person_id, C.observation_id as event_id, C.observation_date as start_date, (C.observation_date + 1*INTERVAL'1 day') as END_DATE,
+ C.observation_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.observation_date as sort_date
+from
+(
+ select o.* , row_number() over (PARTITION BY o.person_id ORDER BY o.observation_date, o.observation_id) as ordinal
+ FROM cdm.OBSERVATION o
+JOIN Codesets codesets on ((o.observation_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (o.observation_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.observation_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.observation_type_concept_id in (38000183,38000199)
+AND (C.value_as_number >= 0.0000 and C.value_as_number <= 99.0000)
+AND C.value_as_string like '%some value%'
+AND C.value_as_concept_id in (36312355)
+AND C.qualifier_concept_id in (4172703,4171754)
+AND C.unit_concept_id in (8554)
+AND (EXTRACT(YEAR FROM C.observation_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004446,38003627)
+AND V.visit_concept_id in (262,9201)
+AND C.ordinal = 1
+-- End Observation Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) P
+INNER JOIN
+(
+ -- Begin Observation Criteria
+select C.person_id, C.observation_id as event_id, C.observation_date as start_date, (C.observation_date + 1*INTERVAL'1 day') as END_DATE,
+ C.observation_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.observation_date as sort_date
+from
+(
+ select o.*
+ FROM cdm.OBSERVATION o
+JOIN Codesets codesets on ((o.observation_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+
+
+-- End Observation Criteria
+
+) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.visit_occurrence_id = P.visit_occurrence_id
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id
+
+) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day')
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id
+) Results
+;
+ANALYZE Inclusion_8
+;
+
+CREATE TEMP TABLE Inclusion_9
+
+AS
+SELECT
+9 as inclusion_rule_id, person_id, event_id
+
+FROM
+(
+ select pe.person_id, pe.event_id
+ FROM qualified_events pe
+
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM qualified_events E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM qualified_events P
+INNER JOIN
+(
+ select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM (
+-- Begin Observation Period Criteria
+select C.person_id, C.observation_period_id as event_id, TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as start_date, TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as end_date,
+ C.period_type_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.observation_period_start_date as sort_date
+
+from
+(
+ select op.*, row_number() over (PARTITION BY op.person_id ORDER BY op.observation_period_start_date) as ordinal
+ FROM cdm.OBSERVATION_PERIOD op
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE C.ordinal = 1
+AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')
+AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')
+AND (C.observation_period_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.observation_period_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.period_type_concept_id in (38000183,38000199)
+AND ((CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) >= 0 and (CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) <= 99)
+AND (EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth <= 99)
+AND (EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth <= 99)
+-- End Observation Period Criteria
+
+) PE
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Observation Period Criteria
+select C.person_id, C.observation_period_id as event_id, TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as start_date, TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as end_date,
+ C.period_type_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.observation_period_start_date as sort_date
+
+from
+(
+ select op.*, row_number() over (PARTITION BY op.person_id ORDER BY op.observation_period_start_date) as ordinal
+ FROM cdm.OBSERVATION_PERIOD op
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE C.ordinal = 1
+AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')
+AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')
+AND (C.observation_period_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.observation_period_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.period_type_concept_id in (38000183,38000199)
+AND ((CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) >= 0 and (CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) <= 99)
+AND (EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth <= 99)
+AND (EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth <= 99)
+-- End Observation Period Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Observation Period Criteria
+select C.person_id, C.observation_period_id as event_id, TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as start_date, TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as end_date,
+ C.period_type_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.observation_period_start_date as sort_date
+
+from
+(
+ select op.*, row_number() over (PARTITION BY op.person_id ORDER BY op.observation_period_start_date) as ordinal
+ FROM cdm.OBSERVATION_PERIOD op
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE C.ordinal = 1
+AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')
+AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')
+AND (C.observation_period_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.observation_period_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.period_type_concept_id in (38000183,38000199)
+AND ((CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) >= 0 and (CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) <= 99)
+AND (EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth <= 99)
+AND (EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth <= 99)
+-- End Observation Period Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) P
+INNER JOIN
+(
+ -- Begin Observation Period Criteria
+select C.person_id, C.observation_period_id as event_id, C.observation_period_start_date as start_date, C.observation_period_end_date as end_date,
+ C.period_type_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.observation_period_start_date as sort_date
+
+from
+(
+ select op.*, row_number() over (PARTITION BY op.person_id ORDER BY op.observation_period_start_date) as ordinal
+ FROM cdm.OBSERVATION_PERIOD op
+) C
+
+
+-- End Observation Period Criteria
+
+) A on A.person_id = P.person_id
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id
+
+) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day')
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id
+) Results
+;
+ANALYZE Inclusion_9
+;
+
+CREATE TEMP TABLE Inclusion_10
+
+AS
+SELECT
+10 as inclusion_rule_id, person_id, event_id
+
+FROM
+(
+ select pe.person_id, pe.event_id
+ FROM qualified_events pe
+
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM qualified_events E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM qualified_events P
+INNER JOIN
+(
+ select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM (
+-- Begin Procedure Occurrence Criteria
+select C.person_id, C.procedure_occurrence_id as event_id, C.procedure_date as start_date, (C.procedure_date + 1*INTERVAL'1 day') as END_DATE,
+ C.procedure_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.procedure_date as sort_date
+from
+(
+ select po.* , row_number() over (PARTITION BY po.person_id ORDER BY po.procedure_date, po.procedure_occurrence_id) as ordinal
+ FROM cdm.PROCEDURE_OCCURRENCE po
+JOIN Codesets codesets on ((po.procedure_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.procedure_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.procedure_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.procedure_type_concept_id in (38000183,38000199)
+AND C.modifier_concept_id in (4000804,4001771)
+AND (C.quantity >= 0 and C.quantity <= 99)
+AND (EXTRACT(YEAR FROM C.procedure_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.procedure_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004446,38003627)
+AND V.visit_concept_id in (262,9201)
+AND C.ordinal = 1
+-- End Procedure Occurrence Criteria
+
+) PE
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Procedure Occurrence Criteria
+select C.person_id, C.procedure_occurrence_id as event_id, C.procedure_date as start_date, (C.procedure_date + 1*INTERVAL'1 day') as END_DATE,
+ C.procedure_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.procedure_date as sort_date
+from
+(
+ select po.* , row_number() over (PARTITION BY po.person_id ORDER BY po.procedure_date, po.procedure_occurrence_id) as ordinal
+ FROM cdm.PROCEDURE_OCCURRENCE po
+JOIN Codesets codesets on ((po.procedure_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.procedure_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.procedure_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.procedure_type_concept_id in (38000183,38000199)
+AND C.modifier_concept_id in (4000804,4001771)
+AND (C.quantity >= 0 and C.quantity <= 99)
+AND (EXTRACT(YEAR FROM C.procedure_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.procedure_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004446,38003627)
+AND V.visit_concept_id in (262,9201)
+AND C.ordinal = 1
+-- End Procedure Occurrence Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Procedure Occurrence Criteria
+select C.person_id, C.procedure_occurrence_id as event_id, C.procedure_date as start_date, (C.procedure_date + 1*INTERVAL'1 day') as END_DATE,
+ C.procedure_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.procedure_date as sort_date
+from
+(
+ select po.* , row_number() over (PARTITION BY po.person_id ORDER BY po.procedure_date, po.procedure_occurrence_id) as ordinal
+ FROM cdm.PROCEDURE_OCCURRENCE po
+JOIN Codesets codesets on ((po.procedure_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.procedure_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.procedure_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.procedure_type_concept_id in (38000183,38000199)
+AND C.modifier_concept_id in (4000804,4001771)
+AND (C.quantity >= 0 and C.quantity <= 99)
+AND (EXTRACT(YEAR FROM C.procedure_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.procedure_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004446,38003627)
+AND V.visit_concept_id in (262,9201)
+AND C.ordinal = 1
+-- End Procedure Occurrence Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) P
+INNER JOIN
+(
+ -- Begin Procedure Occurrence Criteria
+select C.person_id, C.procedure_occurrence_id as event_id, C.procedure_date as start_date, (C.procedure_date + 1*INTERVAL'1 day') as END_DATE,
+ C.procedure_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.procedure_date as sort_date
+from
+(
+ select po.*
+ FROM cdm.PROCEDURE_OCCURRENCE po
+JOIN Codesets codesets on ((po.procedure_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+
+
+-- End Procedure Occurrence Criteria
+
+) A on A.person_id = P.person_id AND A.visit_occurrence_id = P.visit_occurrence_id
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id
+
+) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day')
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id
+) Results
+;
+ANALYZE Inclusion_10
+;
+
+CREATE TEMP TABLE Inclusion_11
+
+AS
+SELECT
+11 as inclusion_rule_id, person_id, event_id
+
+FROM
+(
+ select pe.person_id, pe.event_id
+ FROM qualified_events pe
+
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM qualified_events E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM qualified_events P
+INNER JOIN
+(
+ select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM (
+-- Begin Specimen Criteria
+select C.person_id, C.specimen_id as event_id, C.specimen_date as start_date, (C.specimen_date + 1*INTERVAL'1 day') as end_date,
+ C.specimen_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.specimen_date as sort_date
+from
+(
+ select s.* , row_number() over (PARTITION BY s.person_id ORDER BY s.specimen_date, s.specimen_id) as ordinal
+ FROM cdm.SPECIMEN s
+where s.specimen_concept_id in (SELECT concept_id from Codesets where codeset_id = 0)
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE (C.specimen_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.specimen_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.specimen_type_concept_id in (38000183,38000199)
+AND (C.quantity >= 0.0000 and C.quantity <= 99.0000)
+AND C.unit_concept_id in (8688,9218)
+AND C.anatomic_site_concept_id in (4002601,4001422,4001433)
+AND C.disease_status_concept_id in (4066212)
+AND C.specimen_source_id like '%some sourceID%'
+AND (EXTRACT(YEAR FROM C.specimen_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.specimen_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND C.ordinal = 1
+-- End Specimen Criteria
+
+) PE
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Specimen Criteria
+select C.person_id, C.specimen_id as event_id, C.specimen_date as start_date, (C.specimen_date + 1*INTERVAL'1 day') as end_date,
+ C.specimen_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.specimen_date as sort_date
+from
+(
+ select s.* , row_number() over (PARTITION BY s.person_id ORDER BY s.specimen_date, s.specimen_id) as ordinal
+ FROM cdm.SPECIMEN s
+where s.specimen_concept_id in (SELECT concept_id from Codesets where codeset_id = 0)
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE (C.specimen_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.specimen_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.specimen_type_concept_id in (38000183,38000199)
+AND (C.quantity >= 0.0000 and C.quantity <= 99.0000)
+AND C.unit_concept_id in (8688,9218)
+AND C.anatomic_site_concept_id in (4002601,4001422,4001433)
+AND C.disease_status_concept_id in (4066212)
+AND C.specimen_source_id like '%some sourceID%'
+AND (EXTRACT(YEAR FROM C.specimen_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.specimen_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND C.ordinal = 1
+-- End Specimen Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Specimen Criteria
+select C.person_id, C.specimen_id as event_id, C.specimen_date as start_date, (C.specimen_date + 1*INTERVAL'1 day') as end_date,
+ C.specimen_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.specimen_date as sort_date
+from
+(
+ select s.* , row_number() over (PARTITION BY s.person_id ORDER BY s.specimen_date, s.specimen_id) as ordinal
+ FROM cdm.SPECIMEN s
+where s.specimen_concept_id in (SELECT concept_id from Codesets where codeset_id = 0)
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+WHERE (C.specimen_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.specimen_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.specimen_type_concept_id in (38000183,38000199)
+AND (C.quantity >= 0.0000 and C.quantity <= 99.0000)
+AND C.unit_concept_id in (8688,9218)
+AND C.anatomic_site_concept_id in (4002601,4001422,4001433)
+AND C.disease_status_concept_id in (4066212)
+AND C.specimen_source_id like '%some sourceID%'
+AND (EXTRACT(YEAR FROM C.specimen_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.specimen_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND C.ordinal = 1
+-- End Specimen Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) P
+INNER JOIN
+(
+ -- Begin Specimen Criteria
+select C.person_id, C.specimen_id as event_id, C.specimen_date as start_date, (C.specimen_date + 1*INTERVAL'1 day') as end_date,
+ C.specimen_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id,
+ C.specimen_date as sort_date
+from
+(
+ select s.*
+ FROM cdm.SPECIMEN s
+where s.specimen_concept_id in (SELECT concept_id from Codesets where codeset_id = 0)
+) C
+
+
+-- End Specimen Criteria
+
+) A on A.person_id = P.person_id
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id
+
+) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day')
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id
+) Results
+;
+ANALYZE Inclusion_11
+;
+
+CREATE TEMP TABLE Inclusion_12
+
+AS
+SELECT
+12 as inclusion_rule_id, person_id, event_id
+
+FROM
+(
+ select pe.person_id, pe.event_id
+ FROM qualified_events pe
+
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM qualified_events E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM qualified_events P
+INNER JOIN
+(
+ select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM (
+-- Begin Visit Occurrence Criteria
+select C.person_id, C.visit_occurrence_id as event_id, C.visit_start_date as start_date, C.visit_end_date as end_date,
+ C.visit_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.visit_start_date as sort_date
+from
+(
+ select vo.* , row_number() over (PARTITION BY vo.person_id ORDER BY vo.visit_start_date, vo.visit_occurrence_id) as ordinal
+ FROM cdm.VISIT_OCCURRENCE vo
+JOIN Codesets codesets on ((vo.visit_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (vo.visit_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.CARE_SITE CS on C.care_site_id = CS.care_site_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.visit_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.visit_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.visit_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.visit_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.visit_type_concept_id in (38000183,38000199)
+AND ((CAST(C.visit_end_date AS DATE) - CAST(C.visit_start_date AS DATE)) >= 0 and (CAST(C.visit_end_date AS DATE) - CAST(C.visit_start_date AS DATE)) <= 99)
+AND (EXTRACT(YEAR FROM C.visit_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.visit_start_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004446,38003627)
+AND CS.place_of_service_concept_id in (42628591,42628592)
+AND C.ordinal = 1
+-- End Visit Occurrence Criteria
+
+) PE
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Visit Occurrence Criteria
+select C.person_id, C.visit_occurrence_id as event_id, C.visit_start_date as start_date, C.visit_end_date as end_date,
+ C.visit_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.visit_start_date as sort_date
+from
+(
+ select vo.* , row_number() over (PARTITION BY vo.person_id ORDER BY vo.visit_start_date, vo.visit_occurrence_id) as ordinal
+ FROM cdm.VISIT_OCCURRENCE vo
+JOIN Codesets codesets on ((vo.visit_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (vo.visit_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.CARE_SITE CS on C.care_site_id = CS.care_site_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.visit_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.visit_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.visit_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.visit_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.visit_type_concept_id in (38000183,38000199)
+AND ((CAST(C.visit_end_date AS DATE) - CAST(C.visit_start_date AS DATE)) >= 0 and (CAST(C.visit_end_date AS DATE) - CAST(C.visit_start_date AS DATE)) <= 99)
+AND (EXTRACT(YEAR FROM C.visit_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.visit_start_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004446,38003627)
+AND CS.place_of_service_concept_id in (42628591,42628592)
+AND C.ordinal = 1
+-- End Visit Occurrence Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date
+FROM (-- Begin Visit Occurrence Criteria
+select C.person_id, C.visit_occurrence_id as event_id, C.visit_start_date as start_date, C.visit_end_date as end_date,
+ C.visit_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.visit_start_date as sort_date
+from
+(
+ select vo.* , row_number() over (PARTITION BY vo.person_id ORDER BY vo.visit_start_date, vo.visit_occurrence_id) as ordinal
+ FROM cdm.VISIT_OCCURRENCE vo
+JOIN Codesets codesets on ((vo.visit_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (vo.visit_source_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+JOIN cdm.PERSON P on C.person_id = P.person_id
+JOIN cdm.CARE_SITE CS on C.care_site_id = CS.care_site_id
+LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id
+WHERE (C.visit_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.visit_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND (C.visit_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.visit_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD'))
+AND C.visit_type_concept_id in (38000183,38000199)
+AND ((CAST(C.visit_end_date AS DATE) - CAST(C.visit_start_date AS DATE)) >= 0 and (CAST(C.visit_end_date AS DATE) - CAST(C.visit_start_date AS DATE)) <= 99)
+AND (EXTRACT(YEAR FROM C.visit_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.visit_start_date) - P.year_of_birth <= 99)
+AND P.gender_concept_id in (8532,8507)
+AND PR.specialty_concept_id in (38004446,38003627)
+AND CS.place_of_service_concept_id in (42628591,42628592)
+AND C.ordinal = 1
+-- End Visit Occurrence Criteria
+) Q
+JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id
+ and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date
+) P
+INNER JOIN
+(
+ -- Begin Visit Occurrence Criteria
+select C.person_id, C.visit_occurrence_id as event_id, C.visit_start_date as start_date, C.visit_end_date as end_date,
+ C.visit_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.visit_start_date as sort_date
+from
+(
+ select vo.*
+ FROM cdm.VISIT_OCCURRENCE vo
+
+) C
+
+
+-- End Visit Occurrence Criteria
+
+) A on A.person_id = P.person_id AND A.visit_occurrence_id = P.visit_occurrence_id
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id
+
+) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day')
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 1
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id
+) Results
+;
+ANALYZE Inclusion_12
+;
+
+CREATE TEMP TABLE Inclusion_13
+
+AS
+SELECT
+13 as inclusion_rule_id, person_id, event_id
+
+FROM
+(
+ select pe.person_id, pe.event_id
+ FROM qualified_events pe
+
+JOIN (
+-- Begin Criteria Group
+select 0 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM qualified_events E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM qualified_events P
+INNER JOIN
+(
+ -- Begin Condition Occurrence Criteria
+SELECT C.person_id, C.condition_occurrence_id as event_id, C.condition_start_date as start_date, COALESCE(C.condition_end_date, (C.condition_start_date + 1*INTERVAL'1 day')) as end_date,
+ C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.condition_start_date as sort_date
+FROM
+(
+ SELECT co.*
+ FROM cdm.CONDITION_OCCURRENCE co
+ JOIN Codesets codesets on ((co.condition_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+
+
+-- End Condition Occurrence Criteria
+
+) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -100*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 100*INTERVAL'1 day')
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+UNION ALL
+-- Begin Criteria Group
+select 1 as index_id, person_id, event_id
+FROM
+(
+ select E.person_id, E.event_id
+ FROM qualified_events E
+ INNER JOIN
+ (
+ -- Begin Correlated Criteria
+SELECT 0 as index_id, p.person_id, p.event_id
+FROM qualified_events P
+INNER JOIN
+(
+ -- Begin Procedure Occurrence Criteria
+select C.person_id, C.procedure_occurrence_id as event_id, C.procedure_date as start_date, (C.procedure_date + 1*INTERVAL'1 day') as END_DATE,
+ C.procedure_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.procedure_date as sort_date
+from
+(
+ select po.*
+ FROM cdm.PROCEDURE_OCCURRENCE po
+JOIN Codesets codesets on ((po.procedure_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+
+
+-- End Procedure Occurrence Criteria
+
+) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -60*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 60*INTERVAL'1 day')
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+UNION ALL
+-- Begin Correlated Criteria
+SELECT 1 as index_id, p.person_id, p.event_id
+FROM qualified_events P
+INNER JOIN
+(
+ -- Begin Drug Exposure Criteria
+select C.person_id, C.drug_exposure_id as event_id, C.drug_exposure_start_date as start_date,
+ COALESCE(C.DRUG_EXPOSURE_END_DATE, (DRUG_EXPOSURE_START_DATE + C.DAYS_SUPPLY*INTERVAL'1 day'), (C.DRUG_EXPOSURE_START_DATE + 1*INTERVAL'1 day')) as end_date,
+ C.drug_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id,
+ C.drug_exposure_start_date as sort_date
+from
+(
+ select de.*
+ FROM cdm.DRUG_EXPOSURE de
+JOIN Codesets codesets on ((de.drug_concept_id = codesets.concept_id and codesets.codeset_id = 0))
+) C
+
+
+-- End Drug Exposure Criteria
+
+) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day')
+GROUP BY p.person_id, p.event_id
+HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1
+-- End Correlated Criteria
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) > 0
+) G
+-- End Criteria Group
+
+ ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id
+ GROUP BY E.person_id, E.event_id
+ HAVING COUNT(index_id) = 2
+) G
+-- End Criteria Group
+) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id
+) Results
+;
+ANALYZE Inclusion_13
+;
+
+CREATE TEMP TABLE inclusion_events
+
+AS
+SELECT
+inclusion_rule_id, person_id, event_id
+
+FROM
+(select inclusion_rule_id, person_id, event_id from Inclusion_0
+UNION ALL
+select inclusion_rule_id, person_id, event_id from Inclusion_1
+UNION ALL
+select inclusion_rule_id, person_id, event_id from Inclusion_2
+UNION ALL
+select inclusion_rule_id, person_id, event_id from Inclusion_3
+UNION ALL
+select inclusion_rule_id, person_id, event_id from Inclusion_4
+UNION ALL
+select inclusion_rule_id, person_id, event_id from Inclusion_5
+UNION ALL
+select inclusion_rule_id, person_id, event_id from Inclusion_6
+UNION ALL
+select inclusion_rule_id, person_id, event_id from Inclusion_7
+UNION ALL
+select inclusion_rule_id, person_id, event_id from Inclusion_8
+UNION ALL
+select inclusion_rule_id, person_id, event_id from Inclusion_9
+UNION ALL
+select inclusion_rule_id, person_id, event_id from Inclusion_10
+UNION ALL
+select inclusion_rule_id, person_id, event_id from Inclusion_11
+UNION ALL
+select inclusion_rule_id, person_id, event_id from Inclusion_12
+UNION ALL
+select inclusion_rule_id, person_id, event_id from Inclusion_13) I;
+ANALYZE inclusion_events
+;
+TRUNCATE TABLE Inclusion_0;
+DROP TABLE Inclusion_0;
+
+TRUNCATE TABLE Inclusion_1;
+DROP TABLE Inclusion_1;
+
+TRUNCATE TABLE Inclusion_2;
+DROP TABLE Inclusion_2;
+
+TRUNCATE TABLE Inclusion_3;
+DROP TABLE Inclusion_3;
+
+TRUNCATE TABLE Inclusion_4;
+DROP TABLE Inclusion_4;
+
+TRUNCATE TABLE Inclusion_5;
+DROP TABLE Inclusion_5;
+
+TRUNCATE TABLE Inclusion_6;
+DROP TABLE Inclusion_6;
+
+TRUNCATE TABLE Inclusion_7;
+DROP TABLE Inclusion_7;
+
+TRUNCATE TABLE Inclusion_8;
+DROP TABLE Inclusion_8;
+
+TRUNCATE TABLE Inclusion_9;
+DROP TABLE Inclusion_9;
+
+TRUNCATE TABLE Inclusion_10;
+DROP TABLE Inclusion_10;
+
+TRUNCATE TABLE Inclusion_11;
+DROP TABLE Inclusion_11;
+
+TRUNCATE TABLE Inclusion_12;
+DROP TABLE Inclusion_12;
+
+TRUNCATE TABLE Inclusion_13;
+DROP TABLE Inclusion_13;
+
+
+CREATE TEMP TABLE included_events
+
+AS
+WITH cteIncludedEvents(event_id, person_id, start_date, end_date, op_start_date, op_end_date, ordinal) AS (
+ SELECT event_id, person_id, start_date, end_date, op_start_date, op_end_date, row_number() over (partition by person_id order by start_date ASC) as ordinal
+ from
+ (
+ select Q.event_id, Q.person_id, Q.start_date, Q.end_date, Q.op_start_date, Q.op_end_date, SUM(coalesce(POWER(cast(2 as bigint), I.inclusion_rule_id), 0)) as inclusion_rule_mask
+ from qualified_events Q
+ LEFT JOIN inclusion_events I on I.person_id = Q.person_id and I.event_id = Q.event_id
+ GROUP BY Q.event_id, Q.person_id, Q.start_date, Q.end_date, Q.op_start_date, Q.op_end_date
+ ) MG -- matching groups
+
+ -- the matching group with all bits set ( POWER(2,# of inclusion rules) - 1 = inclusion_rule_mask
+ WHERE (MG.inclusion_rule_mask = POWER(cast(2 as bigint),14)-1)
+
+)
+ SELECT
+event_id, person_id, start_date, end_date, op_start_date, op_end_date
+
+FROM
+cteIncludedEvents Results
+WHERE Results.ordinal = 1
+;
+ANALYZE included_events
+;
+
+
+
+-- generate cohort periods into #final_cohort
+CREATE TEMP TABLE cohort_rows
+
+AS
+WITH cohort_ends (event_id, person_id, end_date) AS (
+ -- cohort exit dates
+ -- By default, cohort exit at the event's op end date
+select event_id, person_id, op_end_date as end_date from included_events
+),
+first_ends (person_id, start_date, end_date) as
+(
+ select F.person_id, F.start_date, F.end_date
+ FROM (
+ select I.event_id, I.person_id, I.start_date, E.end_date, row_number() over (partition by I.person_id, I.event_id order by E.end_date) as ordinal
+ from included_events I
+ join cohort_ends E on I.event_id = E.event_id and I.person_id = E.person_id and E.end_date >= I.start_date
+ ) F
+ WHERE F.ordinal = 1
+)
+ SELECT
+person_id, start_date, end_date
+
+FROM
+first_ends;
+ANALYZE cohort_rows
+;
+
+CREATE TEMP TABLE final_cohort
+
+AS
+WITH cteEndDates (person_id, end_date) AS (
+ SELECT
+ person_id
+ , (event_date + -1 * 0*INTERVAL'1 day') as end_date
+ FROM
+ (
+ SELECT
+ person_id
+ , event_date
+ , event_type
+ , MAX(start_ordinal) OVER (PARTITION BY person_id ORDER BY event_date, event_type ROWS UNBOUNDED PRECEDING) AS start_ordinal
+ , ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY event_date, event_type) AS overall_ord
+ FROM
+ (
+ SELECT
+ person_id
+ , start_date AS event_date
+ , -1 AS event_type
+ , ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY start_date) AS start_ordinal
+ FROM cohort_rows
+
+ UNION ALL
+
+
+ SELECT
+ person_id
+ , (end_date + 0*INTERVAL'1 day') as end_date
+ , 1 AS event_type
+ , NULL
+ FROM cohort_rows
+ ) RAWDATA
+ ) e
+ WHERE (2 * e.start_ordinal) - e.overall_ord = 0
+),
+cteEnds (person_id, start_date, end_date) AS
+(
+ SELECT
+ c.person_id
+ , c.start_date
+ , MIN(e.end_date) AS end_date
+ FROM cohort_rows c
+ JOIN cteEndDates e ON c.person_id = e.person_id AND e.end_date >= c.start_date
+ GROUP BY c.person_id, c.start_date
+)
+ SELECT
+person_id, min(start_date) as start_date, end_date
+
+FROM
+cteEnds
+group by person_id, end_date
+;
+ANALYZE final_cohort
+;
+
+DELETE FROM allCriteriaTest.cohort where cohort_definition_id = 1;
+INSERT INTO allCriteriaTest.cohort (cohort_definition_id, subject_id, cohort_start_date, cohort_end_date)
+select 1 as cohort_definition_id, person_id, start_date, end_date
+FROM final_cohort CO
+;
+
+
+-- Find the event that is the 'best match' per person.
+-- the 'best match' is defined as the event that satisfies the most inclusion rules.
+-- ties are solved by choosing the event that matches the earliest inclusion rule, and then earliest.
+
+CREATE TEMP TABLE best_events
+
+AS
+SELECT
+q.person_id, q.event_id
+
+FROM
+qualified_events Q
+join (
+ SELECT R.person_id, R.event_id, ROW_NUMBER() OVER (PARTITION BY R.person_id ORDER BY R.rule_count DESC,R.min_rule_id ASC, R.start_date ASC) AS rank_value
+ FROM (
+ SELECT Q.person_id, Q.event_id, COALESCE(COUNT(DISTINCT I.inclusion_rule_id), 0) AS rule_count, COALESCE(MIN(I.inclusion_rule_id), 0) AS min_rule_id, Q.start_date
+ FROM qualified_events Q
+ LEFT JOIN inclusion_events I ON q.person_id = i.person_id AND q.event_id = i.event_id
+ GROUP BY Q.person_id, Q.event_id, Q.start_date
+ ) R
+) ranked on Q.person_id = ranked.person_id and Q.event_id = ranked.event_id
+WHERE ranked.rank_value = 1
+;
+ANALYZE best_events
+;
+
+-- modes of generation: (the same tables store the results for the different modes, identified by the mode_id column)
+-- 0: all events
+-- 1: best event
+
+
+-- BEGIN: Inclusion Impact Analysis - event
+-- calculte matching group counts
+delete from allCriteriaTest.cohort_inclusion_result where cohort_definition_id = 1 and mode_id = 0;
+insert into allCriteriaTest.cohort_inclusion_result (cohort_definition_id, inclusion_rule_mask, person_count, mode_id)
+select 1 as cohort_definition_id, inclusion_rule_mask, COUNT(*) as person_count, 0 as mode_id
+from
+(
+ select Q.person_id, Q.event_id, CAST(SUM(coalesce(POWER(cast(2 as bigint), I.inclusion_rule_id), 0)) AS bigint) as inclusion_rule_mask
+ from qualified_events Q
+ LEFT JOIN inclusion_events I on q.person_id = i.person_id and q.event_id = i.event_id
+ GROUP BY Q.person_id, Q.event_id
+) MG -- matching groups
+group by inclusion_rule_mask
+;
+
+-- calculate gain counts
+delete from allCriteriaTest.cohort_inclusion_stats where cohort_definition_id = 1 and mode_id = 0;
+insert into allCriteriaTest.cohort_inclusion_stats (cohort_definition_id, rule_sequence, person_count, gain_count, person_total, mode_id)
+select ir.cohort_definition_id, ir.rule_sequence, coalesce(T.person_count, 0) as person_count, coalesce(SR.person_count, 0) gain_count, EventTotal.total, 0 as mode_id
+from allCriteriaTest.cohort_inclusion ir
+left join
+(
+ select i.inclusion_rule_id, COUNT(i.event_id) as person_count
+ from qualified_events Q
+ JOIN inclusion_events i on Q.person_id = I.person_id and Q.event_id = i.event_id
+ group by i.inclusion_rule_id
+) T on ir.rule_sequence = T.inclusion_rule_id
+CROSS JOIN (select count(*) as total_rules from allCriteriaTest.cohort_inclusion where cohort_definition_id = 1) RuleTotal
+CROSS JOIN (select COUNT(event_id) as total from qualified_events) EventTotal
+LEFT JOIN allCriteriaTest.cohort_inclusion_result SR on SR.mode_id = 0 AND SR.cohort_definition_id = 1 AND (POWER(cast(2 as bigint),RuleTotal.total_rules) - POWER(cast(2 as bigint),ir.rule_sequence) - 1) = SR.inclusion_rule_mask -- POWER(2,rule count) - POWER(2,rule sequence) - 1 is the mask for 'all except this rule'
+WHERE ir.cohort_definition_id = 1
+;
+
+-- calculate totals
+delete from allCriteriaTest.cohort_summary_stats where cohort_definition_id = 1 and mode_id = 0;
+insert into allCriteriaTest.cohort_summary_stats (cohort_definition_id, base_count, final_count, mode_id)
+select 1 as cohort_definition_id, PC.total as person_count, coalesce(FC.total, 0) as final_count, 0 as mode_id
+FROM
+(select COUNT(event_id) as total from qualified_events) PC,
+(select sum(sr.person_count) as total
+ from allCriteriaTest.cohort_inclusion_result sr
+ CROSS JOIN (select count(*) as total_rules from allCriteriaTest.cohort_inclusion where cohort_definition_id = 1) RuleTotal
+ where sr.mode_id = 0 and sr.cohort_definition_id = 1 and sr.inclusion_rule_mask = POWER(cast(2 as bigint),RuleTotal.total_rules)-1
+) FC
+;
+
+-- END: Inclusion Impact Analysis - event
+
+-- BEGIN: Inclusion Impact Analysis - person
+-- calculte matching group counts
+delete from allCriteriaTest.cohort_inclusion_result where cohort_definition_id = 1 and mode_id = 1;
+insert into allCriteriaTest.cohort_inclusion_result (cohort_definition_id, inclusion_rule_mask, person_count, mode_id)
+select 1 as cohort_definition_id, inclusion_rule_mask, COUNT(*) as person_count, 1 as mode_id
+from
+(
+ select Q.person_id, Q.event_id, CAST(SUM(coalesce(POWER(cast(2 as bigint), I.inclusion_rule_id), 0)) AS bigint) as inclusion_rule_mask
+ from best_events Q
+ LEFT JOIN inclusion_events I on q.person_id = i.person_id and q.event_id = i.event_id
+ GROUP BY Q.person_id, Q.event_id
+) MG -- matching groups
+group by inclusion_rule_mask
+;
+
+-- calculate gain counts
+delete from allCriteriaTest.cohort_inclusion_stats where cohort_definition_id = 1 and mode_id = 1;
+insert into allCriteriaTest.cohort_inclusion_stats (cohort_definition_id, rule_sequence, person_count, gain_count, person_total, mode_id)
+select ir.cohort_definition_id, ir.rule_sequence, coalesce(T.person_count, 0) as person_count, coalesce(SR.person_count, 0) gain_count, EventTotal.total, 1 as mode_id
+from allCriteriaTest.cohort_inclusion ir
+left join
+(
+ select i.inclusion_rule_id, COUNT(i.event_id) as person_count
+ from best_events Q
+ JOIN inclusion_events i on Q.person_id = I.person_id and Q.event_id = i.event_id
+ group by i.inclusion_rule_id
+) T on ir.rule_sequence = T.inclusion_rule_id
+CROSS JOIN (select count(*) as total_rules from allCriteriaTest.cohort_inclusion where cohort_definition_id = 1) RuleTotal
+CROSS JOIN (select COUNT(event_id) as total from best_events) EventTotal
+LEFT JOIN allCriteriaTest.cohort_inclusion_result SR on SR.mode_id = 1 AND SR.cohort_definition_id = 1 AND (POWER(cast(2 as bigint),RuleTotal.total_rules) - POWER(cast(2 as bigint),ir.rule_sequence) - 1) = SR.inclusion_rule_mask -- POWER(2,rule count) - POWER(2,rule sequence) - 1 is the mask for 'all except this rule'
+WHERE ir.cohort_definition_id = 1
+;
+
+-- calculate totals
+delete from allCriteriaTest.cohort_summary_stats where cohort_definition_id = 1 and mode_id = 1;
+insert into allCriteriaTest.cohort_summary_stats (cohort_definition_id, base_count, final_count, mode_id)
+select 1 as cohort_definition_id, PC.total as person_count, coalesce(FC.total, 0) as final_count, 1 as mode_id
+FROM
+(select COUNT(event_id) as total from best_events) PC,
+(select sum(sr.person_count) as total
+ from allCriteriaTest.cohort_inclusion_result sr
+ CROSS JOIN (select count(*) as total_rules from allCriteriaTest.cohort_inclusion where cohort_definition_id = 1) RuleTotal
+ where sr.mode_id = 1 and sr.cohort_definition_id = 1 and sr.inclusion_rule_mask = POWER(cast(2 as bigint),RuleTotal.total_rules)-1
+) FC
+;
+
+-- END: Inclusion Impact Analysis - person
+
+-- BEGIN: Censored Stats
+
+-- END: Censored Stats
+
+TRUNCATE TABLE best_events;
+DROP TABLE best_events;
+
+
+
+
+
+TRUNCATE TABLE cohort_rows;
+DROP TABLE cohort_rows;
+
+TRUNCATE TABLE final_cohort;
+DROP TABLE final_cohort;
+
+TRUNCATE TABLE inclusion_events;
+DROP TABLE inclusion_events;
+
+TRUNCATE TABLE qualified_events;
+DROP TABLE qualified_events;
+
+TRUNCATE TABLE included_events;
+DROP TABLE included_events;
+
+TRUNCATE TABLE Codesets;
+DROP TABLE Codesets;