sql смотреть на максимум, рассчитывается почасово - PullRequest
2 голосов
/ 19 сентября 2011

Нужна помощь в некотором SQL.

У меня есть следующий отчет, который мне нужно построить, но в идеале я хочу попробовать создать его с помощью сценария SQL, а не иметь процедуру, которая выполняетсякаждый час и т. д.

Бизнес-проблема, которую мы решаем, - это, как правило, вычисление максимального количества мест, занимаемых в течение данной недели продуктами, рассчитанных ежечасно.

Я знаю, что могу сделать этозапускать процедуру каждый час, которая считает сумму и вставляет ее в таблицу.Затем я запросил бы эту таблицу в конце недели и увидел бы, какой час какого дня имел наибольшее число.

В идеале я хочу сделать это без использования процедур.У меня написан SQL, который может сообщить мне число в любой момент времени (скажем, в часы 10-11 утра в понедельник).

Вместо копирования и вставки этого сценария SQL 24 x 7 раз (по 1 на каждыйчас дня), есть ли что-то еще, что я могу сделать через скрипт SQL здесь?Могу ли я создать таблицу обслуживания, в которой указаны каждый день и период времени (например, столбцы: day, hour_start, hour_end), присоединить его к моему запросу и использовать функцию max?

Я почти уверенчто это не может быть сделано с помощью прямого SQL, но я не фанат зависимых от времени процедур (например, что делать, если сервер должен был отключиться).

Любой совет приветствуется!

1 Ответ

5 голосов
/ 19 сентября 2011

Предполагая такую ​​структуру данных:

create table room_usage ( 
   roomnumber number(6),
   occupied_by varchar2(20),
   startdate date,
   enddate date
);

Вы можете запросить количество занятых комнат в час, например:

with datgen as 
  (select to_date('2008-09-19','yyyy-mm-dd')+(rownum-1)/24 d 
     from dual
     connect by rownum<=168)
select d, (select count(*) from room_usage
             where startdate<=datgen.d
               and enddate>=datgen.d) occupied
  from datgen;

to_date('2008-09-19','yyyy-mm-dd') - это дата начала вашегозапрос, 168 количество часов, которое вы хотите сообщить.

РЕДАКТИРОВАТЬ: Чтобы получить максимальное число и последнюю дату с этим номером, используйте

with datgen as 
  (select to_date('2008-09-19','yyyy-mm-dd')+(rownum-1)/24 d 
     from dual
     connect by rownum<=168),
occ_count as (     
  select d, (select count(*) from room_usage
               where startdate<=datgen.d
                 and enddate>=datgen.d) occupied
    from datgen)
select d, occupied from (select * from occ_count order by occupied desc, d desc)
 where rownum=1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...