你可以使用的东西,如T他的层次查询:
with t as (select name, daytime, status,
row_number() over (partition by name order by daytime) rn,
lead(daytime) over (partition by name order by daytime) ldt,
lead(daytime) over (partition by name order by daytime) - daytime ndt
from motor)
select rn, level, name, trunc(daytime + level - 1) prod_day, daytime + level - 1 sdt,
case when connect_by_isleaf = 1 then ldt end edt, status
from t
connect by prior rn = rn and prior name = name and level - 1 <= ndt
and prior sys_guid() is not null
order by name , rn, sdt
在ndt
我指望我们有多少次添加一天开始daytime
列,它然后用虚列level
比较。条件prior sysquid...
有时用于分层查询以避免循环。
测试数据:
create table motor (Name varchar2(5), prod_day date, daytime date, status varchar2(4));
insert into motor values ('T105', date '2011-12-25', timestamp '2011-12-25 21:00:00', 'STN');
insert into motor values ('T105', date '2012-01-01', timestamp '2012-01-01 02:28:00', 'ACT');
insert into motor values ('T105', date '2012-04-17', timestamp '2012-04-17 16:14:00', 'STN');
insert into motor values ('T105', date '2012-06-01', timestamp '2012-06-01 03:30:00', 'ACT');
insert into motor values ('T7', date '2011-12-30', timestamp '2011-12-30 14:00:00', 'ACT');
insert into motor values ('T7', date '2012-01-02', timestamp '2012-01-02 09:12:00', 'STN');
insert into motor values ('T7', date '2012-01-07', timestamp '2012-01-07 16:30:00', 'ACT');
insert into motor values ('T7', date '2012-05-07', timestamp '2012-05-07 01:06:00', 'STN');
输出:
RN LEVEL NAME PROD_DAY SDT EDT STATUS
---------- ---------- ----- ----------- ------------------- ------------------- ------
1 1 T105 2011-12-25 2011-12-25 21:00:00 STN
1 2 T105 2011-12-26 2011-12-26 21:00:00 STN
1 3 T105 2011-12-27 2011-12-27 21:00:00 STN
...
1 7 T105 2011-12-31 2011-12-31 21:00:00 2012-01-01 02:28:00 STN
2 1 T105 2012-01-01 2012-01-01 02:28:00 ACT
2 2 T105 2012-01-02 2012-01-02 02:28:00 ACT
2 3 T105 2012-01-03 2012-01-03 02:28:00 ACT
...
2 108 T105 2012-04-17 2012-04-17 02:28:00 2012-04-17 16:14:00 ACT
3 1 T105 2012-04-17 2012-04-17 16:14:00 STN
3 2 T105 2012-04-18 2012-04-18 16:14:00 STN
3 3 T105 2012-04-19 2012-04-19 16:14:00 STN
...
3 45 T105 2012-05-31 2012-05-31 16:14:00 2012-06-01 03:30:00 STN
4 1 T105 2012-06-01 2012-06-01 03:30:00 ACT
1 1 T7 2011-12-30 2011-12-30 14:00:00 ACT
1 2 T7 2011-12-31 2011-12-31 14:00:00 ACT
1 3 T7 2012-01-01 2012-01-01 14:00:00 2012-01-02 09:12:00 ACT
2 1 T7 2012-01-02 2012-01-02 09:12:00 STN
2 2 T7 2012-01-03 2012-01-03 09:12:00 STN
2 3 T7 2012-01-04 2012-01-04 09:12:00 STN
...
2 6 T7 2012-01-07 2012-01-07 09:12:00 2012-01-07 16:30:00 STN
3 1 T7 2012-01-07 2012-01-07 16:30:00 ACT
3 2 T7 2012-01-08 2012-01-08 16:30:00 ACT
3 3 T7 2012-01-09 2012-01-09 16:30:00 ACT
...
3 121 T7 2012-05-06 2012-05-06 16:30:00 2012-05-07 01:06:00 ACT
4 1 T7 2012-05-07 2012-05-07 01:06:00 STN
292 rows selected
你能张贴你是在 –
工作SQL到目前为止,我没有sql查询,我尝试了各种选项,但是没有成功,不知道如何在SQL中实现它。 –
不确定如何解释您的数据。你有ACT,从1stJan开始,然后在17thApr切换到STN,但你的输出也显示第二和第三个没有出现在输入中的记录。您在ACT或STN的新时期的前3天显示更改时间? – BriteSponge