【问题标题】:Peak schedule load高峰计划负荷
【发布时间】:2013-02-14 21:01:54
【问题描述】:

我有一张表格,用于记录车辆进出的时间表。

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

【问题讨论】:

  • 如果您发布示例表和数据(我的意思是创建/插入脚本),帮助您会容易得多。我无法在我的脑海中不停地咀嚼这些东西。对我来说......
  • 我在谷歌上搜索,但是 SQLDeveloper 有没有一种简单的方法可以做到这一点?
  • @Plecebo-我的意思是除了您的示例之外,您还应该始终使用示例中的数据构建结构,例如create table... insert into... 这将有助于测试查询并帮助您更好更快。我没有时间为任何人创建、填充结构,抱歉。我不知道为什么人们认为在精神上解决这些问题很容易,或者有人应该为他们创建表格和数据......

标签: sql oracle oracle10g


【解决方案1】:

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

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

您也可以使用分析函数来执行此操作,但相关子查询可能更容易编写。而且,你也是从这条路开始的。

【讨论】:

  • 这相当接近,但只能在特定时间找到道路上的车辆。如何让这找到每个位置/类型组合的“最繁忙”时间?
  • @Plecebo 。 . . row_number() 函数正是这样做的。仅保留数量最多的行。实际上,只有其中之一。如果有联系,那么你会想要使用rank()dense_rank() 而不是row_number()
猜你喜欢
  • 2012-06-28
  • 2011-09-23
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多