生成

2017-05-08 71 views
0

我有如下表显示切换马达的状态,站立和活动的STN和ACT prod_day范围之间记录:生成

Name prod_day daytime    status 
T105 25/Dec/11 25/Dec/11 21:00:00 STN 
T105 01/Jan/12 01/Jan/12 02:28:00 ACT 
T105 17/Apr/12 17/Apr/12 16:14:00 STN 
T105 01/Jun/12 01/Jun/12 03:30:00 ACT 
T7  30/Dec/11 30/Dec/11 14:00:00 ACT 
T7  02/Jan/12 02/Jan/12 09:12:00 STN 
T7  07/Jan/12 07/Jan/12 16:30:00 ACT 
T7  07/May/12 07/May/12 01:06:00 STN 

我需要的是产生以下STN和ACT prod_day之间记录(在选择查询)范围和启动的下一个状态白天将是End_daytime为先前的状态和等,见例如:

Name  prod_day Start_daytime   End_daytime     Status 
T105  01/Jan/12 01/Jan/12 02:28:00         ACT 
T105  02/Jan/12 01/Jan/12 02:28:00         ACT 
T105  03/Jan/12 01/Jan/12 02:28:00         ACT 
T105  17/Apr/12 01/Jan/12 02:28:00  17/Apr/12 16:14:00    ACT 
T105  17/Apr/12 17/Apr/12 16:14:00         STN 
T105  18/Apr/12 17/Apr/12 16:14:00         STN 
T105  19/Apr/12 17/Apr/12 16:14:00         STN 
T105  01/Jun/12 17/Apr/12 16:14:00  01/Jun/12 03:30:00    STN 

感谢您的帮助

+0

你能张贴你是在 –

+0

工作SQL到目前为止,我没有sql查询,我尝试了各种选项,但是没有成功,不知道如何在SQL中实现它。 –

+0

不确定如何解释您的数据。你有ACT,从1stJan开始,然后在17thApr切换到STN,但你的输出也显示第二和第三个没有出现在输入中的记录。您在ACT或STN的新时期的前3天显示更改时间? – BriteSponge

回答

0

你可以使用的东西,如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 
+0

以Ponder Stibbons:谢谢,看起来不错! –