@likilix
Лицемер

Как сформировать отчёт с записями чей интервал не попадет в условие отбора?

Есть таблица с статусами и мне нужно рассчитать время работы по этим данным, например, таблица выглядит сложнее, но для простоты я ее упростил, оставив прежний смысл

create table statuses (
  id number not null,
  transfer date not null
);

Данные таблицы 

id transfer    equipment
1  03.08.2024  1
2  01.10.2024  2
3  03.10.2024  2
4  14.10.2024  3


with 
  statuses as (
    
    select 1 as id, to_date('03.08.2024', 'dd.mm.yyyy') as transfer, 1 as equipment from dual
    
     union all
    
    select 2 as id, to_date('01.10.2024', 'dd.mm.yyyy') as transfer, 2 as equipment from dual
    
     union all
    
    select 3 as id, to_date('03.10.2024', 'dd.mm.yyyy') as transfer, 2 as equipment from dual
    
     union all
    
    select 4 as id, to_date('14.10.2024', 'dd.mm.yyyy') as transfer, 3 as equipment from dual
    
   ), 
  t_report as (
     select t.id
               ,t.transfer as dt_start
               ,lead(t.transfer, 1, sysdate) over(partition by t.equipment order by t.transfer) as dt_end 
               ,t.equipment
       from statuses t
)

  select t.equipment, t.dt_start, t.dt_end, round((t.dt_end - t.dt_start) * 24, 1) as hour 
    from t_report  t 
  where t.dt_start between to_date('01.10.2024', 'dd.mm.yyyy') and to_date('14.10.2024', 'dd.mm.yyyy')


А вот в чем проблема:
статус transfer - это начала работы оборудования, время которого будет постоянно переходить на новые сутки, начиная
от 03.08.2024..04.08.2024..05.08.2024, без добавления записи в таблицу, вплоть до сегодняшнего дня,
т.е мне нужно как-то это хвост (id = 1) добавить в мой запрос to_date('01.10.2024') and to_date('14.10.2024')
и взять время не sysdate - 03.08.2024, а от to_date('01.10.2024') - to_date('14.10.2024')
  • Вопрос задан
  • 208 просмотров
Пригласить эксперта
Ответы на вопрос 1
@yvm
Думаю тут помогут window function
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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