Advertisement
temaon_lieto

page4_sql_indicators

Jul 4th, 2025
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 50.01 KB | None | 0 0
  1. -- SQL query to calculate patient statuses for a specific indicators based on:
  2. -- service requests,
  3. -- diagnostic reports,
  4. -- observations,
  5. -- actions
  6. -- AND additional conditions
  7. WITH reporting_periods AS (SELECT period_name,
  8.                                   original_period_type,
  9.                                   original_period_value,
  10.                                   toDate32('2025-05-01 23:59:59')                                 AS period_end_date,
  11.                                   IF(original_period_type = 'DAY',
  12.                                      dateDiff('day', period_end_date - toIntervalDay(original_period_value),
  13.                                               period_end_date),
  14.                                      dateDiff('day', period_end_date - toIntervalYear(original_period_value),
  15.                                               period_end_date)
  16.                                   )                                                               AS calculated_period_start_days,
  17.                                   (period_end_date - toIntervalDay(calculated_period_start_days)) AS period_start_date
  18.                            FROM dict_reporting_periods rp),
  19.      period_interval AS (SELECT MIN(reporting_periods.period_start_date) AS period_start,
  20.                                 MAX(reporting_periods.period_end_date)   AS period_end
  21.                          FROM reporting_periods),
  22.      patients AS (SELECT DISTINCT ON (id) IF(declaration_status = 'ACTIVE', declaration_end_date,
  23.                                              declaration_updated_at)                                           AS declaration_end_date,
  24.                                           declaration_start_date,
  25.                                           age('day', date_of_birth, (SELECT period_end FROM period_interval))  AS current_age_in_days,
  26.                                           age('year', date_of_birth, (SELECT period_end FROM period_interval)) AS current_age_in_years,
  27.                                           cascade_lvl02_patient_declarations.id,
  28.                                           cascade_lvl02_patient_declarations.gender,
  29.                                           cascade_lvl02_patient_declarations.full_address,
  30.                                           cascade_lvl02_patient_declarations.patient_full_name,
  31.                                           cascade_lvl02_patient_declarations.legal_entity_id,
  32.                                           cascade_lvl02_patient_declarations.employee_id,
  33.                                           cascade_lvl02_patient_declarations.doctor_full_name,
  34.                                           cascade_lvl02_patient_declarations.doctor_position,
  35.                                           cascade_lvl02_patient_declarations.division_id,
  36.                                           cascade_lvl02_patient_declarations.date_of_birth
  37.                   FROM cascade_lvl02_patient_declarations
  38.                   WHERE cascade_lvl02_patient_declarations.legal_entity_id = 3228
  39.                     AND (declaration_start_date <= toDate32('2025-07-04 23:59:59') AND
  40.                          declaration_end_date >= toDate32('1960-01-01 00:00:00'))),
  41.      joined_resources AS (SELECT cascade_lvl01_progress_diseases_services.id,
  42.                                  cascade_lvl01_progress_diseases_services.code,
  43.                                  cascade_lvl01_progress_diseases_services.employee_id,
  44.                                  cascade_lvl01_progress_diseases_services.legal_entity_id,
  45.                                  cascade_lvl01_progress_diseases_services.asserted_date,
  46.                                  cascade_lvl01_progress_diseases_services.encounter_id,
  47.                                  cascade_lvl01_progress_diseases_services.patient_id,
  48.                                  cascade_lvl01_progress_diseases_services.STATUS,
  49.                                  cascade_lvl01_progress_diseases_services.resource_type
  50.                           FROM cascade_lvl01_progress_diseases_services
  51.                           WHERE cascade_lvl01_progress_diseases_services.legal_entity_id = 3228
  52.                             AND cascade_lvl01_progress_diseases_services.resource_type IN
  53.                                 ('observation', 'diagnostic_report', 'service_request')
  54.                             AND (asserted_date BETWEEN (SELECT period_start FROM period_interval) AND (SELECT period_end FROM period_interval))),
  55.      progress_disease_codes AS (SELECT cascade_lvl00_progress_disease_codes.id,
  56.                                        cascade_lvl00_progress_disease_codes.code,
  57.                                        cascade_lvl00_progress_disease_codes.employee_id,
  58.                                        cascade_lvl00_progress_disease_codes.legal_entity_id,
  59.                                        cascade_lvl00_progress_disease_codes.asserted_date,
  60.                                        cascade_lvl00_progress_disease_codes.encounter_id,
  61.                                        cascade_lvl00_progress_disease_codes.patient_id,
  62.                                        cascade_lvl00_progress_disease_codes.ROLE,
  63.                                        cascade_lvl00_progress_disease_codes.code_type
  64.                                 FROM cascade_lvl00_progress_disease_codes
  65.                                 WHERE cascade_lvl00_progress_disease_codes.legal_entity_id = 3228
  66.                                   AND cascade_lvl00_progress_disease_codes.ehealth_status = 'finished'
  67.                                   AND (asserted_date <= (SELECT period_end FROM period_interval))),
  68.      actions AS (SELECT cascade_lvl00_actions.id,
  69.                         cascade_lvl00_actions.code,
  70.                         cascade_lvl00_actions.patient_id,
  71.                         cascade_lvl00_actions.asserted_date
  72.                  FROM cascade_lvl00_actions
  73.                  WHERE cascade_lvl00_actions.legal_entity_id = 3228
  74.                    AND cascade_lvl00_actions.code IN ('K45', 'D45', 'T45')
  75.                    AND (asserted_date BETWEEN (SELECT period_start FROM period_interval) AND (SELECT period_end FROM period_interval))),
  76.      joined_groups AS (SELECT cascade_lvl00_progress_disease_groups.group_name,
  77.                               cascade_lvl00_progress_disease_groups.indicator_name,
  78.                               cascade_lvl00_progress_disease_groups.date_restriction,
  79.                               cascade_lvl00_progress_disease_groups.condition_codes,
  80.                               cascade_lvl00_progress_disease_groups.condition_exclude_codes,
  81.                               cascade_lvl00_progress_disease_groups.condition_female_age_from,
  82.                               cascade_lvl00_progress_disease_groups.condition_female_age_to,
  83.                               cascade_lvl00_progress_disease_groups.condition_male_age_from,
  84.                               cascade_lvl00_progress_disease_groups.condition_male_age_to,
  85.                               cascade_lvl00_progress_disease_groups.condition_reason_code,
  86.                               cascade_lvl00_progress_disease_groups.condition_observation_codes,
  87.                               cascade_lvl00_progress_disease_groups.condition_service_request_codes,
  88.                               cascade_lvl00_progress_disease_groups.condition_optional_observation_codes,
  89.                               cascade_lvl00_progress_disease_groups.condition_diagnostic_report_codes,
  90.                               cascade_lvl00_progress_disease_groups.service_statuses,
  91.                               cascade_lvl00_progress_disease_groups.disease_roles,
  92.                               cascade_lvl00_progress_disease_groups.condition_action_codes,
  93.                               cascade_lvl00_progress_disease_groups.is_no_risk,
  94.                               cascade_lvl00_progress_disease_groups.need_to_check_female_age,
  95.                               cascade_lvl00_progress_disease_groups.skip_female,
  96.                               cascade_lvl00_progress_disease_groups.need_to_check_male_age,
  97.                               cascade_lvl00_progress_disease_groups.skip_male,
  98.                               cascade_lvl00_progress_disease_groups.need_to_check_reason_code,
  99.                               cascade_lvl00_progress_disease_groups.need_to_check_condition_codes,
  100.                               cascade_lvl00_progress_disease_groups.need_to_check_condition_exclude_codes,
  101.                               cascade_lvl00_progress_disease_groups.need_to_check_observation_codes,
  102.                               cascade_lvl00_progress_disease_groups.need_to_check_service_request_codes,
  103.                               cascade_lvl00_progress_disease_groups.need_to_check_optional_observation_codes,
  104.                               cascade_lvl00_progress_disease_groups.need_to_check_diagnostic_report_codes,
  105.                               cascade_lvl00_progress_disease_groups.need_to_check_condition_action_codes,
  106.                               cascade_lvl00_progress_disease_groups.need_to_check_disease_roles,
  107.                               cascade_lvl00_progress_disease_groups.need_to_check_service_statuses,
  108.                               reporting_periods.original_period_type,
  109.                               reporting_periods.original_period_value,
  110.                               reporting_periods.calculated_period_start_days,
  111.                               reporting_periods.period_start_date,
  112.                               reporting_periods.period_end_date
  113.                        FROM cascade_lvl00_progress_disease_groups
  114.                                 JOIN reporting_periods ON cascade_lvl00_progress_disease_groups.date_restriction =
  115.                                                           reporting_periods.period_name),
  116.      observations AS (SELECT joined_resources.code            AS code,
  117.                              joined_resources.legal_entity_id AS legal_entity_id,
  118.                              joined_resources.asserted_date   AS asserted_date,
  119.                              joined_resources.patient_id      AS patient_id,
  120.                              joined_resources.STATUS          AS STATUS,
  121.                              joined_resources.resource_type   AS resource_type
  122.                       FROM joined_resources
  123.                       WHERE joined_resources.resource_type = 'observation'
  124.                         AND joined_resources.STATUS = 'valid'),
  125.      diagnostic_reports AS (SELECT joined_resources.code            AS code,
  126.                                    joined_resources.legal_entity_id AS legal_entity_id,
  127.                                    joined_resources.asserted_date   AS asserted_date,
  128.                                    joined_resources.patient_id      AS patient_id,
  129.                                    joined_resources.STATUS          AS STATUS,
  130.                                    joined_resources.resource_type   AS resource_type
  131.                             FROM joined_resources
  132.                             WHERE joined_resources.resource_type = 'diagnostic_report'
  133.                               AND joined_resources.STATUS = 'final'),
  134.      service_requests AS (SELECT joined_resources.code            AS code,
  135.                                  joined_resources.legal_entity_id AS legal_entity_id,
  136.                                  joined_resources.asserted_date   AS asserted_date,
  137.                                  joined_resources.patient_id      AS patient_id,
  138.                                  joined_resources.STATUS          AS STATUS,
  139.                                  joined_resources.resource_type   AS resource_type
  140.                           FROM joined_resources
  141.                           WHERE joined_resources.resource_type = 'service_request'
  142.                             AND joined_resources.STATUS IN ('active', 'completed')),
  143.      patient_joined_groups AS (SELECT p.patient_full_name,
  144.                                       p.current_age_in_years,
  145.                                       p.id     AS patient_id,
  146.                                       p.employee_id,
  147.                                       p.legal_entity_id,
  148.                                       p.gender AS patient_gender,
  149.                                       jg.group_name,
  150.                                       jg.indicator_name,
  151.                                       jg.condition_codes,
  152.                                       jg.condition_exclude_codes,
  153.                                       jg.condition_female_age_from,
  154.                                       jg.condition_female_age_to,
  155.                                       jg.condition_male_age_from,
  156.                                       jg.condition_male_age_to,
  157.                                       jg.condition_reason_code,
  158.                                       jg.condition_observation_codes,
  159.                                       jg.condition_service_request_codes,
  160.                                       jg.condition_optional_observation_codes,
  161.                                       jg.condition_diagnostic_report_codes,
  162.                                       jg.service_statuses,
  163.                                       jg.disease_roles,
  164.                                       jg.condition_action_codes,
  165.                                       jg.is_no_risk,
  166.                                       jg.need_to_check_female_age,
  167.                                       jg.skip_female,
  168.                                       jg.need_to_check_male_age,
  169.                                       jg.skip_male,
  170.                                       jg.need_to_check_reason_code,
  171.                                       jg.need_to_check_condition_codes,
  172.                                       jg.need_to_check_condition_exclude_codes,
  173.                                       jg.need_to_check_observation_codes,
  174.                                       jg.need_to_check_service_request_codes,
  175.                                       jg.need_to_check_optional_observation_codes,
  176.                                       jg.need_to_check_diagnostic_report_codes,
  177.                                       jg.need_to_check_condition_action_codes,
  178.                                       jg.need_to_check_disease_roles,
  179.                                       jg.need_to_check_service_statuses,
  180.                                       jg.period_start_date,
  181.                                       jg.period_end_date
  182.                                FROM patients p
  183.                                         CROSS JOIN joined_groups jg),
  184.      patient_joined_groups_with_services AS (SELECT patient_joined_groups.patient_id,
  185.                                                     patient_joined_groups.indicator_name,
  186.                                                     patient_joined_groups.group_name,
  187.                                                     jrsr.*
  188.                                              FROM patient_joined_groups
  189.                                                       JOIN service_requests jrsr
  190.                                                            ON patient_joined_groups.need_to_check_service_request_codes =
  191.                                                               TRUE AND
  192.                                                               jrsr.patient_id = patient_joined_groups.patient_id
  193.                                                                AND jrsr.asserted_date >=
  194.                                                                    patient_joined_groups.period_start_date AND
  195.                                                               jrsr.asserted_date <=
  196.                                                               patient_joined_groups.period_end_date
  197.                                                                AND
  198.                                                               (patient_joined_groups.need_to_check_service_statuses AND
  199.                                                                has(patient_joined_groups.service_statuses, jrsr.STATUS))
  200.                                              WHERE (patient_joined_groups.need_to_check_service_request_codes = TRUE AND
  201.                                                     arrayExists(x -> x = jrsr.code,
  202.                                                                 patient_joined_groups.condition_service_request_codes)
  203.                                                        ) SETTINGS allow_experimental_join_condition = 1),
  204.      patient_joined_groups_with_dos AS (SELECT patient_joined_groups.patient_id,
  205.                                                patient_joined_groups.indicator_name,
  206.                                                patient_joined_groups.group_name,
  207.                                                jrdo.*
  208.                                         FROM patient_joined_groups
  209.                                                  JOIN diagnostic_reports jrdo
  210.                                                       ON (patient_joined_groups.need_to_check_diagnostic_report_codes =
  211.                                                           TRUE OR
  212.                                                           patient_joined_groups.need_to_check_optional_observation_codes =
  213.                                                           TRUE)
  214.                                                           AND jrdo.patient_id = patient_joined_groups.patient_id
  215.                                                           AND
  216.                                                          has(patient_joined_groups.condition_diagnostic_report_codes,
  217.                                                              jrdo.code)
  218.                                                           AND
  219.                                                          jrdo.asserted_date >= patient_joined_groups.period_start_date
  220.                                                           AND
  221.                                                          jrdo.asserted_date <= patient_joined_groups.period_end_date
  222.                                         WHERE (patient_joined_groups.need_to_check_diagnostic_report_codes = TRUE AND
  223.                                                arrayExists(x -> x = jrdo.code,
  224.                                                            patient_joined_groups.condition_diagnostic_report_codes)
  225.                                             AND
  226.                                                (NOT patient_joined_groups.need_to_check_optional_observation_codes = TRUE OR
  227.                                                 jrdo.asserted_date < toDate('2024-06-01'))
  228.                                                   ) SETTINGS allow_experimental_join_condition = 1),
  229.      patient_joined_groups_with_observations AS (SELECT patient_joined_groups.patient_id,
  230.                                                         patient_joined_groups.indicator_name,
  231.                                                         patient_joined_groups.group_name,
  232.                                                         jro.*
  233.                                                  FROM patient_joined_groups
  234.                                                           JOIN observations jro
  235.                                                                ON (patient_joined_groups.need_to_check_observation_codes =
  236.                                                                    TRUE OR
  237.                                                                    patient_joined_groups.need_to_check_optional_observation_codes =
  238.                                                                    TRUE) AND
  239.                                                                   jro.patient_id = patient_joined_groups.patient_id
  240.                                                                    AND jro.asserted_date >=
  241.                                                                        patient_joined_groups.period_start_date
  242.                                                                    AND jro.asserted_date <=
  243.                                                                        patient_joined_groups.period_end_date
  244.                                                                    AND
  245.                                                                   (has(patient_joined_groups.condition_observation_codes, jro.code) OR
  246.                                                                    has(
  247.                                                                            patient_joined_groups.condition_optional_observation_codes,
  248.                                                                            jro.code))
  249.                                                  WHERE ((patient_joined_groups.need_to_check_observation_codes AND
  250.                                                          arrayExists(x -> x = jro.code,
  251.                                                                      patient_joined_groups.condition_observation_codes))
  252.                                                      OR
  253.                                                         (patient_joined_groups.need_to_check_optional_observation_codes AND
  254.                                                          arrayExists(x -> x = jro.code,
  255.                                                                      patient_joined_groups.condition_optional_observation_codes))
  256.                                                            ) SETTINGS allow_experimental_join_condition = 1),
  257.      patient_joined_groups_with_reasons AS (SELECT patient_joined_groups.patient_id,
  258.                                                    patient_joined_groups.indicator_name,
  259.                                                    patient_joined_groups.group_name,
  260.                                                    pdrc.*
  261.                                             FROM patient_joined_groups
  262.                                                      JOIN progress_disease_codes pdrc
  263.                                                           ON patient_joined_groups.need_to_check_reason_code = TRUE AND
  264.                                                              pdrc.patient_id = patient_joined_groups.patient_id
  265.                                                               AND
  266.                                                              has(patient_joined_groups.condition_reason_code, pdrc.code)
  267.                                                               AND pdrc.asserted_date >=
  268.                                                                   patient_joined_groups.period_start_date
  269.                                                               AND
  270.                                                              pdrc.asserted_date <= patient_joined_groups.period_end_date
  271.                                             WHERE (patient_joined_groups.need_to_check_reason_code AND
  272.                                                    arrayExists(x -> x = pdrc.code,
  273.                                                                patient_joined_groups.condition_reason_code)) SETTINGS allow_experimental_join_condition = 1),
  274.      patient_joined_groups_with_actions AS (SELECT patient_joined_groups.patient_id,
  275.                                                    patient_joined_groups.indicator_name,
  276.                                                    patient_joined_groups.group_name,
  277.                                                    a.*
  278.                                             FROM patient_joined_groups
  279.                                                      JOIN actions a
  280.                                                           ON patient_joined_groups.need_to_check_condition_action_codes =
  281.                                                              TRUE AND a.patient_id = patient_joined_groups.patient_id
  282.                                                               AND
  283.                                                              a.asserted_date >= patient_joined_groups.period_start_date
  284.                                                               AND
  285.                                                              a.asserted_date <= patient_joined_groups.period_end_date
  286.                                                               AND
  287.                                                              has(patient_joined_groups.condition_action_codes, a.code)
  288.                                             WHERE (patient_joined_groups.need_to_check_condition_action_codes = TRUE AND
  289.                                                    arrayExists(x -> x = a.code,
  290.                                                                patient_joined_groups.condition_action_codes)
  291.                                                       ) SETTINGS allow_experimental_join_condition = 1),
  292.      patient_joined_groups_with_pdc AS (SELECT patient_joined_groups.patient_id,
  293.                                                patient_joined_groups.indicator_name,
  294.                                                patient_joined_groups.group_name,
  295.                                                pdc.*
  296.                                         FROM patient_joined_groups
  297.                                                  JOIN progress_disease_codes pdc
  298.                                                       ON (patient_joined_groups.need_to_check_condition_codes = TRUE OR
  299.                                                           patient_joined_groups.need_to_check_condition_exclude_codes =
  300.                                                           TRUE) AND pdc.patient_id = patient_joined_groups.patient_id
  301.                                                           AND pdc.asserted_date <= patient_joined_groups.period_end_date
  302.                                                           AND (has(patient_joined_groups.condition_codes, pdc.code) OR
  303.                                                                has(patient_joined_groups.condition_exclude_codes, pdc.code))
  304.                                         WHERE (pdc.asserted_date <= patient_joined_groups.period_end_date
  305.                                             AND ((patient_joined_groups.need_to_check_condition_codes = TRUE AND
  306.                                                   arrayExists(x -> x = pdc.code, patient_joined_groups.condition_codes))
  307.                                                 OR
  308.                                                  (patient_joined_groups.need_to_check_condition_exclude_codes = TRUE AND
  309.                                                   arrayExists(x -> x = pdc.code,
  310.                                                               patient_joined_groups.condition_exclude_codes)))
  311.                                                   ) SETTINGS allow_experimental_join_condition = 1),
  312.      patient_groups AS (SELECT pjg.legal_entity_id                                                                                                                 AS legal_entity_id,
  313.                                pjg.patient_id                                                                                                                      AS patient_id,
  314.                                pjg.indicator_name                                                                                                                  AS indicator_name,
  315.                                pjg.group_name                                                                                                                      AS group_name,
  316.                                pjg.employee_id                                                                                                                     AS employee_id,
  317.                                groupUniqArray(pjgd.code)                                                                                                           AS result_condition_diagnostic_report_codes,
  318.                                groupUniqArray(pjgo.code)                                                                                                           AS result_condition_observation_codes,
  319.                                groupUniqArray(pjgs.code)                                                                                                           AS result_condition_service_request_codes,
  320.                                groupUniqArray(pjgr.code)                                                                                                           AS result_reason_codes,
  321.                                groupUniqArray(pjga.code)                                                                                                           AS result_action_codes,
  322.                                groupUniqArray(pjgp.code)                                                                                                           AS result_condition_codes,
  323.                                pjg.patient_gender,
  324.                                pjg.current_age_in_years                                                                                                            AS patient_age,
  325.                                pjg.need_to_check_female_age,
  326.                                pjg.need_to_check_male_age,
  327.                                pjg.need_to_check_reason_code,
  328.                                pjg.need_to_check_condition_codes,
  329.                                pjg.need_to_check_condition_exclude_codes,
  330.                                pjg.need_to_check_observation_codes,
  331.                                pjg.need_to_check_service_request_codes,
  332.                                pjg.need_to_check_diagnostic_report_codes,
  333.                                pjg.need_to_check_condition_action_codes,
  334.                                pjg.need_to_check_optional_observation_codes,
  335.                                pjg.condition_female_age_from,
  336.                                pjg.condition_female_age_to,
  337.                                pjg.condition_male_age_from,
  338.                                pjg.condition_male_age_to,
  339.                                (patient_gender IS NULL OR
  340.                                 (pjg.skip_male AND patient_gender = 0)
  341.                                    OR (group_name IN
  342.                                        ('hiv_screening_no_risk', 'checkup_40_64_with_risk', 'checkup_65_plus_no_risk',
  343.                                         'tb_screening_no_risk', 'hypertension_eval_no_risk'))
  344.                                    OR (pjg.skip_female AND patient_gender = 1)
  345.                                    OR (need_to_check_male_age AND patient_gender = 0 AND
  346.                                        patient_age NOT BETWEEN condition_male_age_from AND condition_male_age_to)
  347.                                    OR (need_to_check_female_age AND patient_gender = 1 AND
  348.                                        patient_age NOT BETWEEN condition_female_age_from AND condition_female_age_to)
  349.                                    )                                                                                                                               AS skip_check,
  350.                                pjg.is_no_risk,
  351.                                pjg.condition_reason_code                                                                                                           AS condition_reason_codes,
  352.                                pjg.condition_action_codes,
  353.                                pjg.condition_codes,
  354.                                pjg.condition_exclude_codes,
  355.                                pjg.condition_observation_codes,
  356.                                pjg.condition_optional_observation_codes,
  357.                                pjg.condition_diagnostic_report_codes,
  358.                                pjg.condition_service_request_codes,
  359.  
  360.                                (need_to_check_reason_code AND LENGTH(result_reason_codes) = 0)                                                                     AS force_quit_reason_check,
  361.                                (need_to_check_condition_action_codes AND LENGTH(result_action_codes) = 0)                                                          AS force_quit_action_check,
  362.                                (need_to_check_condition_codes AND LENGTH(result_condition_codes) = 0)                                                              AS force_quit_condition_check,
  363.                                (need_to_check_service_request_codes AND LENGTH(result_condition_service_request_codes) =
  364.                                                                         0)                                                                                         AS force_quit_service_request_check,
  365.                                (need_to_check_observation_codes AND LENGTH(result_condition_observation_codes) =
  366.                                                                     0)                                                                                             AS force_quit_observation_check,
  367.                                (need_to_check_diagnostic_report_codes AND
  368.                                 LENGTH(result_condition_diagnostic_report_codes) =
  369.                                 0)                                                                                                                                 AS force_quit_diagnostic_report_check,
  370.                                (need_to_check_condition_exclude_codes AND LENGTH(result_condition_codes) =
  371.                                                                           0)                                                                                       AS force_quit_condition_exclude_check,
  372.  
  373.                                IF(skip_check OR NOT need_to_check_diagnostic_report_codes, TRUE,
  374.                                   IF(force_quit_diagnostic_report_check, FALSE,
  375.                                      need_to_check_diagnostic_report_codes AND
  376.                                      arrayExists(x -> has(result_condition_diagnostic_report_codes, x),
  377.                                                  condition_diagnostic_report_codes)
  378.                                   ))                                                                                                                               AS diagnostic_report_check,
  379.                                IF(skip_check OR NOT need_to_check_reason_code, TRUE,
  380.                                   IF(force_quit_reason_check, FALSE,
  381.                                      arrayExists(x -> has(condition_reason_codes, x), result_condition_codes) OR
  382.                                      arrayExists(x -> has(condition_reason_codes, x), result_reason_codes)
  383.                                   ))                                                                                                                               AS reason_check,
  384.                                IF(skip_check OR NOT need_to_check_condition_action_codes, TRUE,
  385.                                   IF(force_quit_action_check, FALSE,
  386.                                      arrayExists(x -> has(condition_action_codes, x), result_action_codes)
  387.                                   ))                                                                                                                               AS action_check,
  388.                                IF(skip_check OR NOT need_to_check_condition_codes, TRUE,
  389.                                   IF(force_quit_condition_check, FALSE,
  390.                                      arrayExists(x -> has(condition_codes, x),
  391.                                                  result_condition_codes)))                                                                                         AS condition_check,
  392.                                IF(skip_check OR NOT need_to_check_service_request_codes, TRUE,
  393.                                   IF(force_quit_service_request_check, FALSE,
  394.                                      need_to_check_service_request_codes AND
  395.                                      arrayExists(x -> has(condition_service_request_codes, x),
  396.                                                  result_condition_service_request_codes)))                                                                         AS service_request_check,
  397.                                IF(skip_check OR NOT need_to_check_condition_exclude_codes, TRUE,
  398.                                   IF(force_quit_condition_exclude_check, TRUE,
  399.                                      NOT arrayExists(x -> has(condition_exclude_codes, x),
  400.                                                      result_condition_codes)))                                                                                     AS condition_exclude_check,
  401.                                IF(skip_check OR NOT need_to_check_observation_codes, TRUE,
  402.                                   IF(force_quit_observation_check, FALSE,
  403.                                      (
  404.                                          (NOT need_to_check_optional_observation_codes AND
  405.                                           LENGTH(arrayIntersect(condition_observation_codes,
  406.                                                                 result_condition_observation_codes)) =
  407.                                           LENGTH(condition_observation_codes))
  408.                                              OR (
  409.                                              need_to_check_optional_observation_codes AND
  410.                                              (
  411.                                                  (LENGTH(arrayIntersect(condition_observation_codes,
  412.                                                                         result_condition_observation_codes)) =
  413.                                                   LENGTH(condition_observation_codes) AND
  414.                                                   ((need_to_check_diagnostic_report_codes AND diagnostic_report_check) OR
  415.                                                    (need_to_check_service_request_codes AND service_request_check)))
  416.                                                      OR LENGTH(arrayIntersect(arrayConcat(condition_observation_codes,
  417.                                                                                           condition_optional_observation_codes),
  418.                                                                               result_condition_observation_codes)) =
  419.                                                         LENGTH(arrayConcat(condition_observation_codes,
  420.                                                                            condition_optional_observation_codes))
  421.                                                  )
  422.                                              )
  423.                                          )
  424.                                   ))                                                                                                                               AS observation_check,
  425.                                CASE
  426.                                    WHEN skip_check OR
  427.                                         (need_to_check_condition_exclude_codes AND NOT condition_exclude_check)
  428.                                        THEN 'no_need_done'
  429.                                    WHEN condition_check AND action_check AND reason_check AND condition_exclude_check
  430.                                        AND IF(need_to_check_optional_observation_codes = TRUE, observation_check,
  431.                                               (need_to_check_observation_codes AND observation_check) OR
  432.                                               ((need_to_check_service_request_codes AND service_request_check) OR
  433.                                                (need_to_check_diagnostic_report_codes AND diagnostic_report_check)))
  434.                                        THEN 'done'
  435.                                    WHEN need_to_check_condition_codes AND condition_check AND
  436.                                         need_to_check_condition_exclude_codes AND condition_exclude_check
  437.                                        THEN 'need_done'
  438.                                    WHEN (is_no_risk AND NOT condition_exclude_check) OR
  439.                                         (NOT is_no_risk AND NOT condition_check) THEN 'no_need_done'
  440.                                    ELSE 'need_done'
  441.                                    END                                                                                                                             AS STATUS,
  442.                                ROW_NUMBER() OVER (PARTITION BY pjg.patient_id, pjg.indicator_name ORDER BY IF(STATUS = 'done', 1, IF(STATUS = 'need_done', 2, 3))) AS status_rank
  443.                         FROM patient_joined_groups pjg
  444.                                  LEFT JOIN patient_joined_groups_with_dos pjgd
  445.                                            USING (patient_id, indicator_name, group_name)
  446.                                  LEFT JOIN patient_joined_groups_with_services pjgs
  447.                                            USING (patient_id, indicator_name, group_name)
  448.                                  LEFT JOIN patient_joined_groups_with_observations pjgo
  449.                                            USING (patient_id, indicator_name, group_name)
  450.                                  LEFT JOIN patient_joined_groups_with_reasons pjgr
  451.                                            USING (patient_id, indicator_name, group_name)
  452.                                  LEFT JOIN patient_joined_groups_with_actions pjga
  453.                                            USING (patient_id, indicator_name, group_name)
  454.                                  LEFT JOIN patient_joined_groups_with_pdc pjgp
  455.                                            USING (patient_id, indicator_name, group_name)
  456.                         GROUP BY pjg.legal_entity_id,
  457.                                  pjg.patient_id,
  458.                                  pjg.legal_entity_id,
  459.                                  pjg.employee_id,
  460.                                  pjg.indicator_name,
  461.                                  pjg.group_name,
  462.                                  pjg.patient_gender,
  463.                                  pjg.current_age_in_years,
  464.                                  pjg.need_to_check_female_age,
  465.                                  pjg.need_to_check_male_age,
  466.                                  pjg.need_to_check_reason_code,
  467.                                  pjg.need_to_check_condition_codes,
  468.                                  pjg.need_to_check_condition_exclude_codes,
  469.                                  pjg.need_to_check_observation_codes,
  470.                                  pjg.need_to_check_service_request_codes,
  471.                                  pjg.need_to_check_diagnostic_report_codes,
  472.                                  pjg.need_to_check_condition_action_codes,
  473.                                  pjg.need_to_check_optional_observation_codes,
  474.                                  pjg.condition_female_age_from,
  475.                                  pjg.condition_female_age_to,
  476.                                  pjg.condition_male_age_from,
  477.                                  pjg.condition_male_age_to,
  478.                                  pjg.skip_male,
  479.                                  pjg.skip_female,
  480.                                  pjg.is_no_risk,
  481.                                  pjg.condition_reason_code,
  482.                                  pjg.condition_action_codes,
  483.                                  pjg.condition_codes,
  484.                                  pjg.condition_exclude_codes,
  485.                                  pjg.condition_observation_codes,
  486.                                  pjg.condition_optional_observation_codes,
  487.                                  pjg.condition_diagnostic_report_codes,
  488.                                  pjg.condition_service_request_codes)
  489. SELECT patient_groups.legal_entity_id                                                                                 AS legal_entity_id,
  490.        countIf(DISTINCT (patient_groups.patient_id), indicator_name = 'checkup_40_64' AND STATUS IN ('need_done',
  491.                                                                                                      'done'))         AS checkup_40_64_total_counter,
  492.        countIf(DISTINCT (patient_groups.patient_id), indicator_name = 'checkup_40_64' AND STATUS IN
  493.                                                                                           ('done'))                   AS checkup_40_64_counter,
  494.        countIf(DISTINCT (patient_groups.patient_id), indicator_name = 'checkup_65_plus' AND STATUS IN ('need_done',
  495.                                                                                                        'done'))       AS checkup_65_plus_total_counter,
  496.        countIf(DISTINCT (patient_groups.patient_id), indicator_name = 'checkup_65_plus' AND STATUS IN
  497.                                                                                             ('done'))                 AS checkup_65_plus_counter,
  498.        countIf(DISTINCT (patient_groups.patient_id), indicator_name = 'prostate_referral' AND STATUS IN ('need_done',
  499.                                                                                                          'done'))     AS prostate_referral_total_counter,
  500.        countIf(DISTINCT (patient_groups.patient_id), indicator_name = 'prostate_referral' AND STATUS IN
  501.                                                                                               ('done'))               AS prostate_referral_counter,
  502.        countIf(DISTINCT (patient_groups.patient_id), indicator_name = 'prostate_referral' AND STATUS IN
  503.                                                                                               ('done'))               AS prostate_completed_total_counter,
  504.        countIf(DISTINCT (patient_groups.patient_id), indicator_name = 'prostate_completed' AND STATUS IN
  505.                                                                                                ('done'))              AS prostate_completed_counter,
  506.        countIf(DISTINCT (patient_groups.patient_id), indicator_name = 'colorectal_referral' AND STATUS IN ('need_done',
  507.                                                                                                            'done'))   AS colorectal_referral_total_counter,
  508.        countIf(DISTINCT (patient_groups.patient_id), indicator_name = 'colorectal_referral' AND STATUS IN
  509.                                                                                                 ('done'))             AS colorectal_referral_counter,
  510.        countIf(DISTINCT (patient_groups.patient_id), indicator_name = 'colorectal_referral' AND STATUS IN
  511.                                                                                                 ('done'))             AS colorectal_completed_total_counter,
  512.        countIf(DISTINCT (patient_groups.patient_id), indicator_name = 'colorectal_completed' AND STATUS IN
  513.                                                                                                  ('done'))            AS colorectal_completed_counter,
  514.        countIf(DISTINCT (patient_groups.patient_id), indicator_name = 'breast_referral' AND STATUS IN ('need_done',
  515.                                                                                                        'done'))       AS breast_referral_total_counter,
  516.        countIf(DISTINCT (patient_groups.patient_id), indicator_name = 'breast_referral' AND STATUS IN
  517.                                                                                             ('done'))                 AS breast_referral_counter,
  518.        countIf(DISTINCT (patient_groups.patient_id), indicator_name = 'breast_referral' AND STATUS IN
  519.                                                                                             ('done'))                 AS breast_completed_total_counter,
  520.        countIf(DISTINCT (patient_groups.patient_id), indicator_name = 'breast_completed' AND STATUS IN
  521.                                                                                              ('done'))                AS breast_completed_counter,
  522.        countIf(DISTINCT (patient_groups.patient_id), indicator_name = 'cv_risk_assessment' AND STATUS IN ('need_done',
  523.                                                                                                           'done'))    AS cv_risk_assessment_total_counter,
  524.        countIf(DISTINCT (patient_groups.patient_id), indicator_name = 'cv_risk_assessment' AND STATUS IN
  525.                                                                                                ('done'))              AS cv_risk_assessment_counter,
  526.        countIf(DISTINCT (patient_groups.patient_id), indicator_name = 'diabetes_screening' AND STATUS IN ('need_done',
  527.                                                                                                           'done'))    AS diabetes_screening_total_counter,
  528.        countIf(DISTINCT (patient_groups.patient_id), indicator_name = 'diabetes_screening' AND STATUS IN
  529.                                                                                                ('done'))              AS diabetes_screening_counter,
  530.        countIf(DISTINCT (patient_groups.patient_id), indicator_name = 'hiv_screening' AND STATUS IN ('need_done',
  531.                                                                                                      'done'))         AS hiv_screening_total_counter,
  532.        countIf(DISTINCT (patient_groups.patient_id), indicator_name = 'hiv_screening' AND STATUS IN
  533.                                                                                           ('done'))                   AS hiv_screening_counter,
  534.        countIf(DISTINCT (patient_groups.patient_id), indicator_name = 'hypertension_eval' AND STATUS IN ('need_done',
  535.                                                                                                          'done'))     AS hypertension_eval_total_counter,
  536.        countIf(DISTINCT (patient_groups.patient_id), indicator_name = 'hypertension_eval' AND STATUS IN
  537.                                                                                               ('done'))               AS hypertension_eval_counter,
  538.        countIf(DISTINCT (patient_groups.patient_id), indicator_name = 'tb_screening' AND STATUS IN ('need_done',
  539.                                                                                                     'done'))          AS tb_screening_total_counter,
  540.        countIf(DISTINCT (patient_groups.patient_id), indicator_name = 'tb_screening' AND STATUS IN
  541.                                                                                          ('done'))                    AS tb_screening_counter
  542. FROM patient_groups
  543. WHERE patient_groups.status_rank = 1
  544.   AND patient_groups.STATUS IN ('need_done', 'done')
  545. GROUP BY patient_groups.legal_entity_id
  546. LIMIT 1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement