Advertisement
DefconOne

Длинные рецепты - расчёт "идеального случая"

Oct 14th, 2023
1,119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- тройные кавычки для переменных из Питона
  2.  
  3. -- фильтр по дате (раньше 2022.11.01 не имеет смысла смотреть, там не было длинных)
  4. -- на выходе получаем список id пациентов для дальнейшей работы
  5. WITH id_filter AS
  6.      (SELECT DISTINCT "ИД пациента" AS pac_id
  7.       FROM public.recipes
  8.       WHERE 1 = 1
  9.             AND "Дата выписки рецепта" >= '2022.11.01'
  10.       -- LIMIT 10000
  11.       )
  12.      
  13. -- все записи по найденным id пациентов, пронумерованные окнами по id и ЛП и сгруппированные по ним же
  14.      , detailed AS
  15.        (SELECT r."ИД пациента" AS id_with_1_or_more_long_at_all
  16.                , r."Препарат по МНН"
  17.                , min("Дата выписки рецепта") OVER (PARTITION BY r."ИД пациента"
  18.                                                                 , r."Препарат по МНН") AS min_date
  19.                , r."Дата выписки рецепта"
  20.                , r."Длинный/ короткий рецепт"
  21.                , max("Продолжительность применения в дн") AS max_dur
  22.                , DENSE_RANK() OVER (PARTITION BY r."ИД пациента"
  23.                                                  , r."Препарат по МНН"
  24.                                                  ORDER BY r."ИД пациента"
  25.                                                           , r."Препарат по МНН"
  26.                                                           , r."Дата выписки рецепта"
  27.                                                           ) AS num
  28.         FROM public.recipes AS r
  29.         RIGHT JOIN id_filter ON id_filter.pac_id = r."ИД пациента"
  30.         WHERE 1 = 1
  31.               AND doctor_or_paramedic IN ''' + ls_doctor_or_paramedic + '''
  32.               AND mo_type LIKE 'Взрослая'
  33.               AND "Дата выписки рецепта" >= '2022.11.01'
  34.               ''' + ls_is_commented + ''' AND "Препарат по МНН" IN ''' + ls_drugs + '''
  35.         GROUP BY r."ИД пациента"
  36.                  , r."Препарат по МНН"
  37.                  , r."Дата выписки рецепта"
  38.                  , r."Длинный/ короткий рецепт"
  39.         ORDER BY r."ИД пациента"
  40.                  , r."Препарат по МНН"
  41.                  , r."Дата выписки рецепта"
  42.                  , r."Длинный/ короткий рецепт"
  43.         -- LIMIT 10000
  44.         )
  45.      
  46. -- добавляем максимальные значения по столбцу с нумерацией
  47.      , detailed_full AS
  48.        (SELECT *
  49.                , max(num) OVER (PARTITION BY d.id_with_1_or_more_long_at_all
  50.                                             , d."Препарат по МНН"
  51.                                             ) AS max_num
  52.         FROM detailed AS d)
  53.                  
  54. -- фильтруем (есть хотя бы 1 длинный) и агрегируем
  55.      , agg AS
  56.        (SELECT *
  57.         FROM detailed_full AS df
  58.         WHERE 1 = 1
  59.               AND df."Длинный/ короткий рецепт" LIKE 'Длинный'
  60.               -- AND NOT df.num = df.max_num
  61.               )
  62.                  
  63. -- рассчитываем "идеальный случай" (все рецепты - длинные, продолжительности - максимально зафиксированные)
  64. SELECT id_with_1_or_more_long_at_all
  65.        , "Препарат по МНН"
  66.        , min_date
  67.        , max_dur
  68.        , (('today'::date - min_date::date)::int / max_dur::int + 1) AS ideal_n_of_visits
  69. FROM agg
  70. GROUP BY id_with_1_or_more_long_at_all
  71.          , "Препарат по МНН"
  72.          , min_date
  73.          , max_dur
  74.          
  75. -- далее строим скрипку или ящик с усами по полученному результату
  76. ;
Tags: medicine
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement