改革运动时间表.Oracle



通过执行以下查询(我使用Oracle 11g)

SELECT EVENTARCHIVE.VEHID vehicle
      , to_char(EVENTARCHIVE.EVENTTIME, 'Dy DD-Mon-YYYY  HH24:MI:SS') occured_on
      , EVENTARCHIVE.EVENTDESCR description
FROM EVENTARCHIVE
     , (SELECT POX
               , POY
               , AREARAD 
        FROM POINTOBJECTS
        WHERE POID = 'PB') PO
WHERE POWER(X - PO.POX, 2) + POWER(Y - PO.POY, 2) < POWER(PO.AREARAD, 2) 
AND   EVENTARCHIVE.EVENTGROUP = 2

我得到一个像这样的数据集

vehicle | occred_on   | description
017     | .. 08:35:12 | stopped moving
021     | .. 09:40:00 | stopped moving
021     | .. 10:00:00 | started moving

可以看到,第21辆车的两个状态显示了它的停车时间。停赛时间长达20分钟。这是stop.mvstarted.mv标志之间的最小跨度。

我想把它修改成

vehicle | stopped_moving | started_moving
021     | .. 09:40:00    | .. 10:00:00

我该怎么做?谢谢!

也许是这样的?

SQL> create table EVENTARCHIVE ( VEHID number, EVENTTIME date, EVENTDESCR  varchar2(20));
Table created.
SQL> REM vehice 17 has no started moving record.
SQL> insert into EVENTARCHIVE values(17, to_date('24/12/2012 08:35:12', 'dd/mm/yyyy hh24:mi:ss'), 'stopped moving');
1 row created.
SQL> REM vehice 21 has multiple stop / starts
SQL> insert into EVENTARCHIVE values(21, to_date('24/12/2012 09:40:00', 'dd/mm/yyyy hh24:mi:ss'), 'stopped moving');
1 row created.
SQL> insert into EVENTARCHIVE values(21, to_date('24/12/2012 10:00:00', 'dd/mm/yyyy hh24:mi:ss'), 'started moving');
1 row created.
SQL> insert into EVENTARCHIVE values(21, to_date('24/12/2012 10:22:00', 'dd/mm/yyyy hh24:mi:ss'), 'stopped moving');
1 row created.
SQL> insert into EVENTARCHIVE values(21, to_date('24/12/2012 12:00:00', 'dd/mm/yyyy hh24:mi:ss'), 'started moving');
1 row created.
SQL> REM vehice 25 has multiple stop / starts records start with a started moving record.
SQL> insert into EVENTARCHIVE values(25, to_date('23/12/2012 16:35:00', 'dd/mm/yyyy hh24:mi:ss'), 'started moving');
1 row created.
SQL> insert into EVENTARCHIVE values(25, to_date('23/12/2012 22:59:00', 'dd/mm/yyyy hh24:mi:ss'), 'stopped moving');
1 row created.
SQL> insert into EVENTARCHIVE values(25, to_date('24/12/2012 07:00:00', 'dd/mm/yyyy hh24:mi:ss'), 'started moving');
1 row created.
SQL> REM vehice 33 has some duplicate stopped data (possible?)
SQL> insert into EVENTARCHIVE values(33, to_date('23/12/2012 16:35:00', 'dd/mm/yyyy hh24:mi:ss'), 'started moving');
1 row created.
SQL> insert into EVENTARCHIVE values(33, to_date('23/12/2012 22:59:00', 'dd/mm/yyyy hh24:mi:ss'), 'stopped moving');
1 row created.
SQL> insert into EVENTARCHIVE values(33, to_date('23/12/2012 23:02:00', 'dd/mm/yyyy hh24:mi:ss'), 'stopped moving');
1 row created.
SQL> insert into EVENTARCHIVE values(33, to_date('24/12/2012 07:00:00', 'dd/mm/yyyy hh24:mi:ss'), 'started moving');
1 row created.
SQL> commit;
Commit complete.
SQL> select vehid, eventtime stopped_moving, next_time started_moving
  2    from (select vehid, eventtime, eventdescr,
  3         case
  4           when lead(eventdescr) over (partition by vehid order by eventtime) != eventdescr
  5           then
  6             lead(eventtime)  over (partition by vehid order by eventtime)
  7         end next_time
  8  from EVENTARCHIVE)
  9   where eventdescr = 'stopped moving'
 10     and next_time is not null;
     VEHID STOPPED_MOVING       STARTED_MOVING
---------- -------------------- --------------------
        21 24-dec-2012 09:40:00 24-dec-2012 10:00:00
        21 24-dec-2012 10:22:00 24-dec-2012 12:00:00
        25 23-dec-2012 22:59:00 24-dec-2012 07:00:00
        33 23-dec-2012 23:02:00 24-dec-2012 07:00:00

你可以用子查询来做,也许是这样的工作:

SELECT 
    e1.VEHID vehicle, 
    to_char(e1.EVENTTIME, 'Dy DD-Mon-YYYY  HH24:MI:SS') stopped, 
    to_char(e2.EVENTTIME, 'Dy DD-Mon-YYYY  HH24:MI:SS') started 
FROM 
    EVENTARCHIVE e1, 
    EVENTARCHIVE e2 
WHERE 
    e1.EVENTDESCR = 'stopped moving' 
    AND e2.ID IN (
        SELECT ID 
        FROM EVENTARCHIVE 
        WHERE 
            EVENTTIME<e1.EVENTTIME 
            AND EVENTDESCR = 'started moving' 
            AND VEHID = e1.VEHID 
        ORDER BY e1.EVENTTIME DESC LIMIT 1
    )

(我假设有一个列ID。)

你可以这样做,

select min(occred_on) stopped_moving,max(occred_on) started_moving
from table group by vehicle;

希望这对你有帮助,

SELECT EVENTARCHIVE.VEHID vehicle
      , min(to_char(EVENTARCHIVE.EVENTTIME, 'Dy DD-Mon-YYYY  HH24:MI:SS')) stopped_moving,
        max(to_char(EVENTARCHIVE.EVENTTIME, 'Dy DD-Mon-YYYY  HH24:MI:SS')) started_moving,
      , EVENTARCHIVE.EVENTDESCR description
FROM EVENTARCHIVE
     , (SELECT POX
               , POY
               , AREARAD 
        FROM POINTOBJECTS
        WHERE POID = 'PB') PO
WHERE POWER(X - PO.POX, 2) + POWER(Y - PO.POY, 2) < POWER(PO.AREARAD, 2) 
AND   EVENTARCHIVE.EVENTGROUP = 2 group by vehicle

最新更新