            
CREATE TABLE IF NOT EXISTS SOL_RWD_COHORT_DISCOVERY_cohort (
			cohort_definition_id integer NOT NULL,
			subject_id integer NOT NULL,
			cohort_start_date date NOT NULL,
			cohort_end_date date NOT NULL );
CREATE TABLE #Codesets  (codeset_id int NOT NULL,
  concept_id bigint NOT NULL
)
DISTSTYLE ALL;
INSERT INTO #Codesets (codeset_id, concept_id)
SELECT 8 as codeset_id, c.concept_id FROM (select distinct I.concept_id FROM
( 
  select concept_id from SOL_RWD_COHORT_DISCOVERY_concept where concept_id in (439777,137829,25518,24006)
UNION  select c.concept_id
  from SOL_RWD_COHORT_DISCOVERY_concept c
  join SOL_RWD_COHORT_DISCOVERY_concept_ancestor ca on c.concept_id = ca.descendant_concept_id
  and ca.ancestor_concept_id in (439777,137829,25518,24006)
  and c.invalid_reason is null
) I
LEFT JOIN
(
  select concept_id from SOL_RWD_COHORT_DISCOVERY_concept where concept_id in (437090,440218,4301602)
UNION  select c.concept_id
  from SOL_RWD_COHORT_DISCOVERY_concept c
  join SOL_RWD_COHORT_DISCOVERY_concept_ancestor ca on c.concept_id = ca.descendant_concept_id
  and ca.ancestor_concept_id in (437090,440218,4301602)
  and c.invalid_reason is null
) E ON I.concept_id = E.concept_id
WHERE E.concept_id is null
) C;
ANALYZE #Codesets;
CREATE TABLE #qualified_events
DISTKEY(person_id)
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  ASC ) as ordinal, cast(pe.visit_occurrence_id as bigint) as visit_occurrence_id
  FROM (-- 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, E.event_id ) 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 
  (
  -- Begin Condition Occurrence Criteria
SELECT C.person_id, C.condition_occurrence_id as event_id, C.start_date, C.end_date,
  C.visit_occurrence_id, C.start_date as sort_date
FROM 
(
  SELECT co.person_id,co.condition_occurrence_id,co.condition_concept_id,co.visit_occurrence_id,co.condition_start_date as start_date, COALESCE(co.condition_end_date, DATEADD(day,CAST(1 as int),co.condition_start_date)) as end_date , ROW_NUMBER() OVER (PARTITION BY co.person_id  ORDER BY co.condition_start_date, co.condition_occurrence_id ) as ordinal
  FROM SOL_RWD_COHORT_DISCOVERY_condition_occurrence co
  JOIN #Codesets cs on (co.condition_concept_id = cs.concept_id and cs.codeset_id = 8)
) C
WHERE C.ordinal = 1
-- End Condition Occurrence Criteria
  ) E
	JOIN SOL_RWD_COHORT_DISCOVERY_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 DATEADD(day,CAST(0 as int),OP.OBSERVATION_PERIOD_START_DATE) <= E.START_DATE AND DATEADD(day,CAST(0 as int),E.START_DATE) <= OP.OBSERVATION_PERIOD_END_DATE
) P
WHERE P.ordinal = 1
-- End Primary Events
) pe
) QE
;
--- Inclusion Rule Inserts
CREATE TABLE #inclusion_events  (inclusion_rule_id bigint,
	 person_id bigint,
	event_id bigint
)
DISTKEY(person_id);
CREATE TABLE #included_events
DISTKEY(person_id)
AS
SELECT
event_id,  person_id , start_date, end_date, op_start_date, op_end_date
FROM
(
  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
) Results
WHERE Results.ordinal = 1
;
-- generate cohort periods into #final_cohort
CREATE TABLE #cohort_rows
DISTKEY(person_id)
AS
SELECT
 person_id , start_date, end_date
FROM
( -- first_ends
	select F.person_id, F.start_date, F.end_date
	FROM (
	  select I.event_id, I.person_id, I.start_date, CE.end_date, ROW_NUMBER() OVER (partition by I.person_id, I.event_id  ORDER BY CE.end_date ) as ordinal
	  from #included_events I
	  join ( -- cohort_ends
-- 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
    ) CE on I.event_id = CE.event_id and I.person_id = CE.person_id and CE.end_date >= I.start_date
	) F
	WHERE F.ordinal = 1
) FE;
CREATE TABLE #final_cohort
DISTKEY(person_id)
AS
SELECT
 person_id , min(start_date) as start_date, end_date
FROM
( --cteEnds
	SELECT
		 c.person_id
		, c.start_date
		, MIN(ed.end_date) AS end_date
	FROM #cohort_rows c
	JOIN ( -- cteEndDates
    SELECT
      person_id
      , DATEADD(day,CAST(-1 * 0 as int),event_date)  as end_date
    FROM
    (
      SELECT
        person_id
        , event_date
        , event_type
        , SUM(event_type) OVER (PARTITION BY person_id ORDER BY event_date, event_type ROWS UNBOUNDED PRECEDING) AS interval_status
      FROM
      (
        SELECT
          person_id
          , start_date AS event_date
          , -1 AS event_type
        FROM #cohort_rows
        UNION ALL
        SELECT
          person_id
          , DATEADD(day,CAST(0 as int),end_date) as end_date
          , 1 AS event_type
        FROM #cohort_rows
      ) RAWDATA
    ) e
    WHERE interval_status = 0
  ) ed ON c.person_id = ed.person_id AND ed.end_date >= c.start_date
	GROUP BY c.person_id, c.start_date
) e
group by person_id, end_date
;
DELETE FROM SOL_RWD_COHORT_DISCOVERY_cohort where cohort_definition_id = 1;
INSERT INTO SOL_RWD_COHORT_DISCOVERY_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
;
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;
