Вычислить количество экземпляров, запущенных в определенный период времени - PullRequest
1 голос
/ 11 октября 2011

Привет. Я хотел бы рассчитать количество экземпляров пакетной обработки для определенного временного интервала.Например, у меня есть таблица:

BatchID startTime   endTime
12957   10:15   10:25
13032   10:16   10:20
13080   10:16   10:22
13090   10:16   10:20
13214   10:19   10:30
13232   10:19   10:22
13276   10:19   10:29
13279   10:19   10:30
13315   10:20   10:23
13341   10:20   10:24
13430   10:22   10:33
13566   10:27   10:30
13580   10:27   10:31
13585   10:28   10:31
13596   10:28   10:32
13626   10:30   10:42
13637   10:32   10:35
13699   10:40   10:44
13702   10:41   10:45

Число экземпляров, запущенных в 10:41, будет равно 3, а количество запущенных пакетов: BatchID 13626, 13699 и 13702.

Чтобы визуализировать эту проблему, у меня есть чат с интервалом времени от 10:15 до 10:41 с шагом в 1 минуту в качестве оси X и количеством экземпляров, работающих в этом интервале времени в качестве оси Y.Я думаю реализовать в ORACLE (SQL / PLSQL) или EXCEL (функция / VBA / сводная таблица / и т.д.), что вы посоветуете?

Ответы [ 2 ]

2 голосов
/ 11 октября 2011

Чтобы перечислить все в определенное время:

SELECT BatchID, startTime, endTime
FROM Batch
WHERE :instanceTime BETWEEN startTime AND endTime

Или просто посчитать их:

SELECT COUNT(*) AS numConcurrent
FROM Batch
WHERE :instanceTime BETWEEN startTime AND endTime

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

SELECT startTime, endTime
FROM Batch
WHERE endTime > :intervalStart
AND startTime < :intervalEnd
ORDER BY startTime

:instanceTime - это параметр запроса.Параметры заменяются значениями, которые вы предоставляете вместе с запросом, и вам не нужно беспокоиться о форматировании и экранировании.(Некоторые поставщики данных используют ? для параметров.)

Если вы не можете использовать параметры, вы можете заменить их фактическим значением.Не забудьте использовать to_date() в этом случае.


Вот несколько примеров использования параметров даты в VBA:
Bytes.com: Как передать параметр даты в OracleСтрока SQL в VBA

1 голос
/ 12 октября 2011

Создание таблицы с примерами:

SQL> create table mytable (batchid,starttime,endtime)
  2  as
  3  select 12957, '10:15', '10:25' from dual union all
  4  select 13032, '10:16', '10:20' from dual union all
  5  select 13080, '10:16', '10:22' from dual union all
  6  select 13090, '10:16', '10:20' from dual union all
  7  select 13214, '10:19', '10:30' from dual union all
  8  select 13232, '10:19', '10:22' from dual union all
  9  select 13276, '10:19', '10:29' from dual union all
 10  select 13279, '10:19', '10:30' from dual union all
 11  select 13315, '10:20', '10:23' from dual union all
 12  select 13341, '10:20', '10:24' from dual union all
 13  select 13430, '10:22', '10:33' from dual union all
 14  select 13566, '10:27', '10:30' from dual union all
 15  select 13580, '10:27', '10:31' from dual union all
 16  select 13585, '10:28', '10:31' from dual union all
 17  select 13596, '10:28', '10:32' from dual union all
 18  select 13626, '10:30', '10:42' from dual union all
 19  select 13637, '10:32', '10:35' from dual union all
 20  select 13699, '10:40', '10:44' from dual union all
 21  select 13702, '10:41', '10:45' from dual
 22  /

Table created.

Представляя начало и конец интервала, о котором вы хотите сообщить, в качестве переменных связывания. Вы можете распознать использование переменных связывания в SQL и PL / SQL по их ведущим двоеточиям.

SQL> var START_X_AXIS varchar2(5)
SQL> var END_X_AXIS varchar2(5)
SQL> begin
  2    :START_X_AXIS := '10:15';
  3    :END_X_AXIS := '10:41';
  4  end;
  5  /

PL/SQL procedure successfully completed.

И запрос, который выполняется в три этапа для ясности. Сначала преобразуйте ваш varchar2 в реальные даты (кстати, советую хранить их и так). Второй запрос показывает все минуты на оси X для вашего отчета. Третий подсчитывает.

SQL> with mytable_with_real_dates as
  2  ( select batchid
  3         , to_date(starttime,'hh24:mi') starttime
  4         , to_date(endtime,'hh24:mi') endtime
  5      from mytable
  6  )
  7  , all_minutes as
  8  ( select to_date(:START_X_AXIS,'hh24:mi') + numtodsinterval(level-1,'minute') minute
  9      from dual
 10   connect by level <=  24 * 60 * (to_date(:END_X_AXIS,'hh24:mi') - to_date(:START_X_AXIS,'hh24:mi')) + 1
 11  )
 12  select to_char(m.minute,'hh24:mi')
 13       , count(t.batchid)
 14    from all_minutes m
 15         left outer join mytable_with_real_dates t on (m.minute between t.starttime and t.endtime)
 16   group by m.minute
 17   order by m.minute
 18  /

TO_CH COUNT(T.BATCHID)
----- ----------------
10:15                1
10:16                4
10:17                4
10:18                4
10:19                8
10:20               10
10:21                8
10:22                9
10:23                7
10:24                6
10:25                5
10:26                4
10:27                6
10:28                8
10:29                8
10:30                8
10:31                5
10:32                4
10:33                3
10:34                2
10:35                2
10:36                1
10:37                1
10:38                1
10:39                1
10:40                2
10:41                3

27 rows selected.

РЕДАКТИРОВАТЬ: Я только что видел ваш комментарий, что ваши столбцы хранятся как даты. Это хорошая новость, поэтому вы можете пропустить первую часть и начать со строки № 7, заменив запятую словом «WITH».

С уважением,
Роб.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...