@cptedward_kenway
Как жить, если Константин Цветков не ответил?

Как правильно составить функцию?

ТЗ:
На основании таблицы PROCESS_REQUIREMENTS, необходимо сделать функцию, которая будет возвращать ID контейнера, который должен быть сейчас запущен.
Для выбора процесса необходимо проверять:

1.отработавшие процессы не должны попадать в список запущенных (кроме многоразовых процессов, например:e16, ocr, odb
2.Выбирается самый ранний процесс по времени ко времени проверки, который еще не был запущен.
DoD Написана функция без параметров

PROCESS_REQUIREMENTS:
spoiler
64624cd08b920881153342.png

prc_session содержит в себе контейнеры, которые были запущенны в определенный промежуток времени
пункт 2 я выполнил написав:
spoiler
CREATE OR REPLACE FUNCTION SV_ASU.asu_next_con
    RETURN NUMBER
is
    next_con NUMBER(20,0);
begin
    with temp as 
    (
        select distinct 
            pr.container_id as container_id
            , end_time
            , count(container_id) as c
        from 
            main.prc_session ps 
            full join SV_ASU.PROCESS_REQUIREMENTS pr  on pr.container_id = ps.PROCESS_ID
        where  
            ps.start_time between to_date ('16/06/2022 0:00:00', 'dd/mm/yy hh24:mi:ss') and to_date ('16/06/2022 19:59:00', 'dd/mm/yy hh24:mi:ss')  --тут будет за сегодняшнюю дату  
            and pr.container_id is not null
            and ps.parent_id is null
        group by pr.container_id
            , end_time
            --, count(container_id)
            order by end_time desc
        FETCH NEXT 1 ROWS ONLY
    ) --последний отработавший контейнер
        select
                lead(pr.container_id, 1) over (order by pr.execution_order)  as nv   --следующий контейнер от последнего отработавшего контейнера  
    into next_con
        from 
            temp
        full join 
            SV_ASU.PROCESS_REQUIREMENTS pr  on pr.container_id = temp.container_id          
        order by 
            temp.container_id asc
        FETCH NEXT 1 ROWS ONLY;
return next_con;
end asu_next_con;
/


теперь необходимо как-то воткнуть условие пункта 1 (некоторые контейнеры могут запускаться <=2 раза - это контейнеры 50000029, 70000019, 70000020)

пытался реализовать что-то типа этого (пронумеровать отработавшие контейнеры за определенный промежуток времени и далее с помощью декода, кейса их по определенным правилам отображать), но определенно это делаю неправильно:
spoiler
with temp as 
    (
        select distinct 
            pr.container_id as container_id
            , ps.start_time
            , end_time
            , rank() over (partition by pr.container_id order by ps.start_time) as rn
        from 
            main.prc_session ps 
            full join SV_ASU.PROCESS_REQUIREMENTS pr  on pr.container_id = ps.PROCESS_ID
        where  
            ps.start_time between to_date ('16/06/2022 0:00:00', 'dd/mm/yy hh24:mi:ss') and to_date ('16/06/2022 19:59:00', 'dd/mm/yy hh24:mi:ss')  --тут будет за сегодняшнюю дату  
            and pr.container_id is not null
            and ps.parent_id is null
            order by end_time desc
        FETCH NEXT 1 ROWS ONLY
    ) --последний отработавший контейнер
        select /* decode (pr.container_id, 50000029 and temp.rn <= 2, 50000029, lead(pr.container_id, 1) over (order by pr.execution_order), 
                          70000019 and temp.rn <= 2, 70000019, lead(pr.container_id, 1) over (order by pr.execution_order),
                          70000020 and temp.rn <= 2, 70000020,
                          pr.container_id and temp.rn < 2, lead(pr.container_id, 1) over (order by pr.execution_order), null) nv*/
               case pr.container_id
               when  50000029 and temp.rn <= 2 then lead(pr.container_id, 1) over (order by pr.execution_order)
               when  70000019 and temp.rn <= 2 then lead(pr.container_id, 1) over (order by pr.execution_order)
               when  70000020 and temp.rn <= 2 then lead(pr.container_id, 1) over (order by pr.execution_order)
               when  pr.container_id and temp.rn < 2 then lead(pr.container_id, 1) over (order by pr.execution_order)
               else null
               end as nv
              --  lead(pr.container_id, 1) over (order by pr.execution_order)  as nv   --следующий контейнер от последнего отработавшего контейнера  
                , temp.start_time
        from 
            temp
        full join 
            SV_ASU.PROCESS_REQUIREMENTS pr  on pr.container_id = temp.container_id
        order by 
            temp.container_id asc
        FETCH NEXT 1 ROWS ONLY;
  • Вопрос задан
  • 84 просмотра
Пригласить эксперта
Ответы на вопрос 1
tsklab
@tsklab
Здесь отвечаю на вопросы.
ВЫБРАТЬ ВРЕМЯ_ЗАПУСКА + 24H, КОД
ГДЕ ВРЕМЯ_ЗАПУСКА + 24H > МОМЕНТ

ОБЪЕДЕНИТЬ

ВЫБРАТЬ ВРЕМЯ_ЗАПУСКА, КОД
ГДЕ ВРЕМЯ_ЗАПУСКА > МОМЕНТ

СОРТИРОВКА 1 ТОЛЬКО 1 СТРОКА
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы