2016-10-24 19 views
1

下表包含具有给定ID的操作何时开始和完成的操作记录,如operation所示。根据订单和列值查询相关行

是否有生产,将有下列的SAS视图的方式 - runIDtypesessionNamestartTimeendtimedurationInMinutes?它应该由具有相同ID的相关行组成,并且startTimeendTime是彼此距离最近的两个最近的行。

id operation time 
1 starts 13:45 
2 starts 13:46 
3 starts 13:50 
4 starts 13:55 
2 ends 14:02 
1 ends 14:50 
3 ends 14:51 
1 starts 15:25 
3 starts 15:42 
2 starts 15:51 
4 ends 18:02 
1 ends 18:09 
3 ends 18:25 
2 ends 18:30 
+0

如果按ID排序,那么数据队列的开始/结束时间或者可以有孤儿开始/结束时间。 – Reeza

回答

3

我觉得你是这么想的。我做一个自我加入并从那里开始。让我知道是否需要澄清。

data inData; 
input id operation $10. time time. ; 
format time hhmm. ; 
datalines; 
1 starts 13:45 
2 starts 13:46 
3 starts 13:50 
4 starts 13:55 
2 ends 14:02 
1 ends 14:50 
3 ends 14:51 
1 starts 15:25 
3 starts 15:42 
2 starts 15:51 
4 ends 18:02 
1 ends 18:09 
3 ends 18:25 
2 ends 18:30 

; 

proc sql; 
create view tempView as 
select a.id, a.operation as Type , a.Time as StartTime, 
    b.operation as Type2, b.time as EndTime, 
    INTCK('minute',a.Time,b.Time) as durationInMinutes 
from indata a inner join indata b 
    on a.id=b.id 
group by a.id, b.Time 
having durationInMinutes > 0 and a.operation='starts' and 
    b.operation='ends' 
order by a.id , StartTime, durationInMinutes 
; 
quit; 

proc sql; 
create view YourView as 
select * 
from TempView 
group by ID , StartTime 
having min(durationInMinutes)=durationInMinutes 
; 
quit; 
+0

谢谢,它把我放在正确的方向,我会从那里开始:) –

1

你可以尝试这样的事:

SET @time='00:00'; SET @cnt=0; 

SELECT @cnt:[email protected]+1 runID, `id`, start_time, end_time, TIMEDIFF(end_time, start_time) duration 
FROM (
SELECT `id`, @time start_time, @time:=`time` end_time, `operation` 
FROM yourTableName 
ORDER BY `id`, `time`, `operation` DESC) tmp 
WHERE tmp.`operation`='ends' 
1

也许只是在基地SAS容易或更容易。是否要求对它进行排序或建立索引 - 如果已编制索引,则可以跳过中间排序视图have_s

data have; 
input id operation $ time :time5.; 
datalines; 
1 starts 13:45 
2 starts 13:46 
3 starts 13:50 
4 starts 13:55 
2 ends 14:02 
1 ends 14:50 
3 ends 14:51 
1 starts 15:25 
3 starts 15:42 
2 starts 15:51 
4 ends 18:02 
1 ends 18:09 
3 ends 18:25 
2 ends 18:30 
;;;; 
run; 
proc sql; 
    create view have_s as 
    select id, operation,time 
    from have 
    order by id, time, operation descending; 
quit; 
data want/view=want; 
    set have_s; 
    by id; 
    retain startTime; 
    if first.id then startTime=.; 
    if operation='starts' then startTime=time; 
    else if operation='ends' then do; 
    endTime=time; 
    durationInMinutes = intck('minute',startTime,endTime,'c') ; 
    output; 
    end; 
run;