Advertisement
DefconOne

Длинные рецепты - оконные выражения (wo_pwd)

Oct 7th, 2023
1,795
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. WITH rec_mm_3_4_2022 AS
  2.      (SELECT "ИД пациента" AS patient_id_mm_3_4_2022,
  3.              "Препарат по МНН" AS drug_name_mm_3_4_2022,
  4.              "Дата выписки рецепта" AS date_mm_3_4_2022,
  5.              MIN("Дата выписки рецепта") OVER (PARTITION BY "ИД пациента") AS min_date_mm_3_4_2022,
  6.              MAX("Дата выписки рецепта") OVER (PARTITION BY "ИД пациента") AS max_date_mm_3_4_2022,
  7.              COUNT("Дата выписки рецепта") OVER (PARTITION BY "ИД пациента") AS count_recipes_mm_3_4_2022,
  8.              MIN("Дата выписки рецепта") OVER (PARTITION BY "ИД пациента", "Препарат по МНН") AS drug_min_date_mm_3_4_2022,
  9.              MAX("Дата выписки рецепта") OVER (PARTITION BY "ИД пациента", "Препарат по МНН") AS drug_max_date_mm_3_4_2022,
  10.              COUNT("Дата выписки рецепта") OVER (PARTITION BY "ИД пациента", "Препарат по МНН") AS count_drug_recipes_mm_3_4_2022
  11.       FROM public.recipes
  12.       WHERE mo_type LIKE 'Взрослая'
  13.             AND doctor_or_paramedic LIKE 'Врач'
  14.             AND "Дата выписки рецепта" >= ''' + mm_3_4_2022_start + '''
  15.             AND "Дата выписки рецепта" < ''' + mm_3_4_2022_end + '''
  16.       ORDER BY "ИД пациента"),
  17.      
  18.      t_visits_mm_3_4_2022 AS
  19.      (SELECT "ИД пациента" AS patient_id_mm_3_4_2022_2,
  20.              COUNT(DISTINCT "Дата выписки рецепта") AS visits_mm_3_4_2022
  21.       FROM public.recipes
  22.       WHERE mo_type LIKE 'Взрослая'
  23.             AND doctor_or_paramedic LIKE 'Врач'
  24.             AND "Дата выписки рецепта" >= ''' + mm_3_4_2022_start + '''
  25.             AND "Дата выписки рецепта" < ''' + mm_3_4_2022_end + '''
  26.       GROUP BY "ИД пациента"),
  27.      
  28.       total_2022 AS
  29.       (SELECT patient_id_mm_3_4_2022,
  30.               drug_name_mm_3_4_2022,
  31.               date_mm_3_4_2022,
  32.               min_date_mm_3_4_2022,
  33.               max_date_mm_3_4_2022,
  34.               count_recipes_mm_3_4_2022,
  35.               drug_min_date_mm_3_4_2022,
  36.               drug_max_date_mm_3_4_2022,
  37.               count_drug_recipes_mm_3_4_2022,
  38.               visits_mm_3_4_2022,
  39.               count_recipes_mm_3_4_2022 / visits_mm_3_4_2022 AS avg_rec_per_visit_mm_3_4_2022 --,
  40.        --     visits_mm_3_4_2022 / (max_date_mm_3_4_2022::date - min_date_mm_3_4_2022::date) AS avg_visits_per_day
  41.        FROM rec_mm_3_4_2022
  42.        JOIN t_visits_mm_3_4_2022 ON rec_mm_3_4_2022.patient_id_mm_3_4_2022 = t_visits_mm_3_4_2022.patient_id_mm_3_4_2022_2
  43.        ORDER BY visits_mm_3_4_2022 DESC,
  44.                 patient_id_mm_3_4_2022),
  45.      
  46.       rec_mm_3_4_2023 AS
  47.       (SELECT "ИД пациента" AS patient_id_mm_3_4_2023,
  48.               "Препарат по МНН" AS drug_name_mm_3_4_2023,
  49.               "Дата выписки рецепта" AS date_mm_3_4_2023,
  50.               MIN("Дата выписки рецепта") OVER (PARTITION BY "ИД пациента") AS min_date_mm_3_4_2023,
  51.               MAX("Дата выписки рецепта") OVER (PARTITION BY "ИД пациента") AS max_date_mm_3_4_2023,
  52.               COUNT("Дата выписки рецепта") OVER (PARTITION BY "ИД пациента") AS count_recipes_mm_3_4_2023,
  53.               MIN("Дата выписки рецепта") OVER (PARTITION BY "ИД пациента", "Препарат по МНН") AS drug_min_date_mm_3_4_2023,
  54.               MAX("Дата выписки рецепта") OVER (PARTITION BY "ИД пациента", "Препарат по МНН") AS drug_max_date_mm_3_4_2023,
  55.               COUNT("Дата выписки рецепта") OVER (PARTITION BY "ИД пациента", "Препарат по МНН") AS count_drug_recipes_mm_3_4_2023
  56.        FROM public.recipes
  57.        WHERE mo_type LIKE 'Взрослая'
  58.              AND doctor_or_paramedic LIKE 'Врач'
  59.              AND "Дата выписки рецепта" >= ''' + mm_3_4_2023_start + '''
  60.              AND "Дата выписки рецепта" < ''' + mm_3_4_2023_end + '''
  61.        ORDER BY "ИД пациента"),
  62.      
  63.       t_visits_mm_3_4_2023 AS
  64.       (SELECT "ИД пациента" AS patient_id_mm_3_4_2023_2,
  65.               COUNT(DISTINCT "Дата выписки рецепта") AS visits_mm_3_4_2023
  66.        FROM public.recipes
  67.        WHERE mo_type LIKE 'Взрослая'
  68.              AND doctor_or_paramedic LIKE 'Врач'
  69.              AND "Дата выписки рецепта" >= ''' + mm_3_4_2023_start + '''
  70.              AND "Дата выписки рецепта" < ''' + mm_3_4_2023_end + '''
  71.        GROUP BY "ИД пациента"),
  72.      
  73.       total_2023 AS
  74.       (SELECT patient_id_mm_3_4_2023,
  75.               drug_name_mm_3_4_2023,
  76.               date_mm_3_4_2023,
  77.               min_date_mm_3_4_2023,
  78.               max_date_mm_3_4_2023,
  79.               count_recipes_mm_3_4_2023,
  80.               drug_min_date_mm_3_4_2023,
  81.               drug_max_date_mm_3_4_2023,
  82.               count_drug_recipes_mm_3_4_2023,
  83.               visits_mm_3_4_2023,
  84.               count_recipes_mm_3_4_2023 / visits_mm_3_4_2023 AS avg_rec_per_visit_mm_3_4_2023 --,
  85.        --     visits_mm_3_4_2023 / (max_date_mm_3_4_2023::date - min_date_mm_3_4_2023::date) AS avg_visits_per_day
  86.        FROM rec_mm_3_4_2023
  87.        JOIN t_visits_mm_3_4_2023 ON rec_mm_3_4_2023.patient_id_mm_3_4_2023 = t_visits_mm_3_4_2023.patient_id_mm_3_4_2023_2
  88.        ORDER BY visits_mm_3_4_2023 DESC,
  89.                 patient_id_mm_3_4_2023),
  90.      
  91.       agg AS
  92.       (SELECT patient_id_mm_3_4_2022,
  93.               drug_name_mm_3_4_2022,
  94.               TO_CHAR(min_date_mm_3_4_2022, 'YYYY-MM') AS min_mm_3_4_2022,
  95.               TO_CHAR(max_date_mm_3_4_2022, 'YYYY-MM') AS max_mm_3_4_2022,
  96.               count_recipes_mm_3_4_2022,
  97.               TO_CHAR(drug_min_date_mm_3_4_2022, 'YYYY-MM') AS drug_min_mm_3_4_2022,
  98.               TO_CHAR(drug_max_date_mm_3_4_2022, 'YYYY-MM') AS drug_max_mm_3_4_2022,
  99.               count_drug_recipes_mm_3_4_2022,
  100.               patient_id_mm_3_4_2023,
  101.               drug_name_mm_3_4_2023,
  102.               TO_CHAR(min_date_mm_3_4_2023, 'YYYY-MM') AS min_mm_3_4_2023,
  103.               TO_CHAR(max_date_mm_3_4_2023, 'YYYY-MM') AS max_mm_3_4_2023,
  104.               count_recipes_mm_3_4_2023,
  105.               TO_CHAR(drug_min_date_mm_3_4_2023, 'YYYY-MM') AS drug_min_mm_3_4_2023,
  106.               TO_CHAR(drug_max_date_mm_3_4_2023, 'YYYY-MM') AS drug_max_mm_3_4_2023,
  107.               count_drug_recipes_mm_3_4_2023
  108.        FROM total_2022
  109.        JOIN total_2023 ON total_2022.patient_id_mm_3_4_2022 = total_2023.patient_id_mm_3_4_2023
  110.        ORDER BY count_drug_recipes_mm_3_4_2023 DESC),
  111.      
  112.       tmp_mm_3_4_2022 AS
  113.       (SELECT patient_id_mm_3_4_2022 AS id,
  114.               drug_name_mm_3_4_2022 AS drug_name,
  115.               min_mm_3_4_2022 AS start_year_mm,
  116.               count_recipes_mm_3_4_2022 AS count_recipes,
  117.               count_drug_recipes_mm_3_4_2022 AS count_drug_recipes,
  118.               (((''' + mm_3_4_2022_end + '''::DATE - ''' + mm_3_4_2022_start + '''::DATE) / 365.25 * 12) / count_recipes_mm_3_4_2022) AS INTERVAL,
  119.               (((''' + mm_3_4_2022_end + '''::DATE - ''' + mm_3_4_2022_start + '''::DATE) / 365.25 * 12) / count_drug_recipes_mm_3_4_2022) AS interval_by_drugs
  120.        FROM agg
  121.        ORDER BY count_drug_recipes_mm_3_4_2022 DESC,
  122.                 INTERVAL DESC,
  123.                 drug_name_mm_3_4_2022,
  124.                 patient_id_mm_3_4_2022
  125.        LIMIT 12),
  126.      
  127.       tmp_mm_3_4_2023 AS
  128.       (SELECT patient_id_mm_3_4_2023 AS id,
  129.               drug_name_mm_3_4_2023 AS drug_name,
  130.               min_mm_3_4_2023 AS start_year_mm,
  131.               count_recipes_mm_3_4_2023 AS count_recipes,
  132.               count_drug_recipes_mm_3_4_2023 AS count_drug_recipes,
  133.               (((''' + mm_3_4_2023_end + '''::DATE - ''' + mm_3_4_2023_start + '''::DATE) / 365.25 * 12) / count_recipes_mm_3_4_2023) AS INTERVAL,
  134.               (((''' + mm_3_4_2023_end + '''::DATE - ''' + mm_3_4_2023_start + '''::DATE) / 365.25 * 12) / count_drug_recipes_mm_3_4_2023) AS interval_by_drugs
  135.        FROM agg
  136.        ORDER BY count_drug_recipes_mm_3_4_2023 DESC,
  137.                 INTERVAL DESC,
  138.                 drug_name_mm_3_4_2023,
  139.                 patient_id_mm_3_4_2023
  140.        LIMIT 12)
  141.                  
  142. SELECT *
  143. FROM tmp_mm_3_4_2022
  144.                  
  145. UNION ALL
  146.                  
  147. SELECT *
  148. FROM tmp_mm_3_4_2023;
Tags: medicine
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement