2013-02-14 2 views
1

У меня есть таблица, которая отслеживает расписание транспортных средств и вылетов.Peak schedule load

Table: Schedule 
route location v_type out     in 
=================================================================== 
a  loc1  10  2/14/2013 08:04:00 2/14/2013 10:03:00 
b  loc1  11  2/14/2013 08:06:00 2/14/2013 14:20:00 
c  loc2  11  2/14/2013 06:22:00 2/14/2013 07:50:00 
d  loc1  10  2/14/2013 11:04:00 2/14/2013 10:03:00 
e  loc2  10  2/14/2013 08:06:00 2/14/2013 14:20:00 
f  loc2  11  2/14/2013 06:22:00 2/14/2013 07:50:00 

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

Желаемые результаты, т.

location v_type time   peak 
=========================================== 
loc1  10  2/14/2013 10:40 110 
loc1  11  2/14/2013 10:30 80 
loc2  10  2/14/2013 08:05 67 
loc2  11  2/14/2013 09:45 107 

т.д.

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

Это то, что у меня есть до сих пор, но оно работает неправильно и работает медленно.

SELECT s.location, 
    s.v_type, 
    TO_CHAR(TRUNC(s.out, 'mi') - mod(EXTRACT(minute FROM CAST(s.out AS TIMESTAMP)), 10)/(24 * 60), 'YYYY-MM-DD HH24:MI') AS TIME, 
    (SELECT 
    (SELECT COUNT(*) 
    FROM SCHEDULE s2 
    WHERE s2.out BETWEEN TRUNC(s.out) AND (TRUNC(s.out, 'mi') - mod(EXTRACT(minute FROM CAST(s.out AS TIMESTAMP)), 10)/(24 * 60)) 
    )               
    - 
    (SELECT COUNT(*) 
    FROM SCHEDULE s2 
    WHERE s2.out BETWEEN TRUNC(s.in) AND (TRUNC(s.in, 'mi') - mod(EXTRACT(minute FROM CAST(s.in AS TIMESTAMP)), 10)/(24 * 60)) 
    ) 
FROM dual 
) 
FROM SCHEDULE s 
GROUP BY s.location, s.v_type, 
(TRUNC(s.out, 'mi') - mod(EXTRACT(minute FROM CAST(s.out AS TIMESTAMP)), 10)/(24 * 60)) 
+0

Было бы намного проще помочь вам, если вы разместите образцы таблиц и данных, и я имею в виду сценарии создания/вставки. Я не могу хрустнуть такие вещи в моем сознании. для меня ... – Art

+0

Я googling, но есть ли простой способ сделать это от SQLDeveloper? – Plecebo

+0

@ Plecebo-то, что я имел в виду, в дополнение к вашим примерам, вы всегда должны строить структуры с данными, как в ваших примерах, например. создать таблицу ... вставить в ... Это поможет проверить запросы и помочь вам лучше и быстрее. У меня нет времени создавать, заполнять структуры для кого-то, извините. Я не знаю, почему люди предполагают, что легко решить такие проблемы умственно, или кто-то должен создавать таблицы и данные для них ... – Art

ответ

0

Я хотел бы посмотреть на это как разницу между совокупными суммами:

select s.* 
from (select s.*, (numout - numin) as onroad, 
      row_number() over (partition by loc, vtype order by numout - numin desc) as seqnum 
     from (select s.*, 
        (select count(*) from schedule s2 where s2.loc = s.loc and s2.vtype = s.vtype and s2.out <= s.out 
        ) as numout, 
        (select count(*) from schedule s2 where s2.loc = s.loc and s2.vtype = s.vtype and and s2.in <= s.out 
        ) as numin 
      from schedule s 
      ) s 
    ) s 
where seq = 1 

Вы также можете сделать это с помощью аналитических функций, но коррелированные подзапросы, наверное, проще писать. Кроме того, вы начали этот путь.

+0

Это довольно близко, но только находит транспортные средства на дороге в определенное время. Как бы это сделать, чтобы найти «самое загруженное» время для каждой комбинации местоположения/типа? – Plecebo

+0

@Plecebo. , , Функция 'row_number()' выполняет именно это. Сохраняются только строки с наибольшей суммой. На самом деле, только один из них. Если есть связи, то вы захотите использовать 'rank()' или 'dense_rank()', а не 'row_number()'. –