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
我在数据类型为日期的同一列中有时间和日期。
架构详细信息
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 |
我有 table 如下。
我需要的结果是不同列中的 IN 和 OUT,如 RESULT table 所示。如果特定车辆的第一个条目是 IN 那么我需要立即 OUT 否则将其留空。 但是,如果特定车辆的第一条记录是 OUT 那么我需要获取该车辆前一天的最后一条 IN 记录(如果存在)任何(图中 veh2 的示例)。
有没有办法使用 oracle 查询来做到这一点?任何人都可以帮我做这件事吗?提前致谢。
数据为文本: 08/04/15 08:00:00 上午
veh108/04/15 08:15:00 上午
veh108/04/15 veh1 出场 08:17:00 AM
08/04/15 08:20:00 上午
veh108/04/15 veh1 出场 08:50:00 AM
08/04/15 09:15:00 上午
veh108/04/15 veh1 出场 09:30:00 AM
08/04/15 10:15:00 上午
veh108/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
我在数据类型为日期的同一列中有时间和日期。
架构详细信息
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 |