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函数正是这样做的。仅保留数量最大的行。实际上,只有一个是。如果有联系,那么您可能希望使用秩或密集秩而不是行数。