1

車両の出入りのスケジュールを追跡するテーブルがあります。

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

これを想像してみてください。ただし、1 日に何千ものルートがあります。私は各場所について見つけようとしています.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))
4

1 に答える 1

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

分析関数を使用してこれを行うこともできますが、おそらく相関サブクエリの方が簡単に記述できます。また、あなたはこの道を歩み始めました。

于 2013-02-14T21:54:36.617 に答える