Sql 高峰负荷

Sql 高峰负荷,sql,oracle,oracle10g,Sql,Oracle,Oracle10g,我有一张记录车辆进出时间表的表格 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/

我有一张记录车辆进出时间表的表格

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_类型的时间或窗口,大多数车辆将在道路上

期望的结果,例如

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))

我将其视为累积金额之间的差异:

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

您也可以使用分析函数来实现这一点,但是相关子查询可能更容易编写。另外,您也是沿着这条路开始的。

如果您发布示例表和数据,我指的是创建/插入脚本,那么帮助您会容易得多。我无法在脑海中准确地理解这些事情。对我来说…我在谷歌上搜索,但是SQLDeveloper有没有一种简单的方法可以做到这一点?@Plecebo我的意思是,除了你的示例之外,你应该始终使用示例中的数据构建结构,例如,创建表。。。插入到。。。这将有助于测试查询,并帮助您更好更快地完成任务。对不起,我没有时间为任何人创建、填充结构。我不知道为什么人们会认为在精神上处理这些问题很容易,或者有人应该为他们创建表格和数据……这是相当接近的,但只会在特定的时间发现路上的车辆。如何让它找到每个位置/类型组合的“最忙”时间?@Plecebo。row_number函数正是这样做的。仅保留数量最大的行。实际上,只有一个是。如果有联系,那么您可能希望使用秩或密集秩而不是行数。