Oracle查询根据条件在单独的列中获取数据

Oracle query to Get data in separate columns based on condition

我有 table 如下。

喜欢下面

我需要的结果是不同列中的 IN 和 OUT,如 RESULT table 所示。如果特定车辆的第一个条目是 IN 那么我需要立即 OUT 否则将其留空。 但是,如果特定车辆的第一条记录是 OUT 那么我需要获取该车辆前一天的最后一条 IN 记录(如果存在)任何(图中 veh2 的示例)。

有没有办法使用 oracle 查询来做到这一点?任何人都可以帮我做这件事吗?提前致谢。

数据为文本: 08/04/15 08:00:00 上午

veh1

08/04/15 08:15:00 上午

veh1

08/04/15 veh1 出场 08:17:00 AM

08/04/15 08:20:00 上午

veh1

08/04/15 veh1 出场 08:50:00 AM

08/04/15 09:15:00 上午

veh1

08/04/15 veh1 出场 09:30:00 AM

08/04/15 10:15:00 上午

veh1

08/04/15 veh2 出场 08:00:00 AM

08/04/15 veh2 在 08:15:00 上午

08/04/15 veh2 输出 09:50:00 AM

08/04/15 veh2 在 10:10:00 AM

我在数据类型为日期的同一列中有时间和日期。

SQL Fiddle

架构详细信息

create table vehicle_entry
(dt date,
 vehicle_no varchar2(20),
 entry_mode varchar2(10),
 entry_date varchar2(20));

 insert into vehicle_entry values('05-Aug-2015','v1','IN','08:00:00 AM');
 insert into vehicle_entry values('05-Aug-2015','v1','IN','08:15:00 AM');
 insert into vehicle_entry values('05-Aug-2015','v1','OUT','08:17:00 AM');
 insert into vehicle_entry values('05-Aug-2015','v1','IN','08:20:00 AM');
 insert into vehicle_entry values('05-Aug-2015','v1','OUT','08:50:00 AM');
 insert into vehicle_entry values('05-Aug-2015','v1','IN','10:15:00 AM');
 insert into vehicle_entry values('04-Aug-2015','v2','IN','10:12:00 PM');
 insert into vehicle_entry values('05-Aug-2015','v2','OUT','08:20:00 AM');

Select查询

select to_char(complete_date, 'mm/dd/rrrr') as dt,vehicle_no, in_date,(select out_date from
(select rownum as rn,vehicle_no, entry_mode, to_date(to_char(dt,'dd-Mon-rrrr') || ' ' || entry_date, 'dd-Mon-rrrr hh:mi:ss AM') complete_date,
case when entry_mode='IN' then to_date(to_char(dt,'dd-Mon-rrrr') || ' ' || entry_date, 'dd-Mon-rrrr hh:mi:ss AM') else null end as in_date,
case when entry_mode='OUT' then to_date(to_char(dt,'dd-Mon-rrrr') || ' ' || entry_date, 'dd-Mon-rrrr hh:mi:ss AM') else null end as out_date
from vehicle_entry
order by vehicle_no, complete_date) b where b.rn=a.rn+1 and b.vehicle_no=a.vehicle_no
) as out_date
from
(
select rownum as rn,vehicle_no, entry_mode, to_date(to_char(dt,'dd-Mon-rrrr') || ' ' || entry_date, 'dd-Mon-rrrr hh:mi:ss AM') complete_date,
case when entry_mode='IN' then to_date(to_char(dt,'dd-Mon-rrrr') || ' ' || entry_date, 'dd-Mon-rrrr hh:mi:ss AM') else null end as in_date,
case when entry_mode='OUT' then to_date(to_char(dt,'dd-Mon-rrrr') || ' ' || entry_date, 'dd-Mon-rrrr hh:mi:ss AM') else null end as out_date
from vehicle_entry
order by vehicle_no, complete_date
) a
where in_date is not null
order by vehicle_no,1

输出

|         DT | VEHICLE_NO |                  IN_DATE |                 OUT_DATE |
|------------|------------|--------------------------|--------------------------|
| 08/05/2015 |         v1 | August, 05 2015 08:00:00 |                   (null) |
| 08/05/2015 |         v1 | August, 05 2015 08:15:00 | August, 05 2015 08:17:00 |
| 08/05/2015 |         v1 | August, 05 2015 08:20:00 | August, 05 2015 08:50:00 |
| 08/05/2015 |         v1 | August, 05 2015 10:15:00 |                   (null) |
| 08/04/2015 |         v2 | August, 04 2015 22:12:00 | August, 05 2015 08:20:00 |