1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
* "Сжать" данные, объединив непрерывные отрезки времени.

** ВОПРОС .

Имеется массив данных такого вида:

id      time1   time2
1       100     200
1       200     300
1       300     400
1       500     600
1       600     700
1       800     830
2       800     900
2       900     930

Требуется исключить лишние наблюдения, объединив те из них, которые образуют
в пределах одного ID непрерывные интервалы времени по переменным time1 и time2.
Например, для ID=1 первый отрезок времени между time1 и time2 составляет 100-200.
В следующем наблюдении этот отрезок непрерывно продолжается для того же ID=1 (200-300).
И в следующем. Затем наступает разрыв (предыдущий отрезок заканчивается значением 400, 
а следующий начинается значением 500).
Я не знаю, сколько наблюдений могут образовывать непрерывный отрезок времени. Иногда - 1, иногда - несколько.
В конце концов требуется преобразовать данные к такому виду:

Желаемый результат.
id      time1   time2
1       100     400
1       500     700
1       800     830
2       800     930


* ОТВЕТ. Автор: rlevesque@videotron.ca.

DATA LIST LIST /id time1 time2.
BEGIN DATA
1       100     200
1       200     300
1       300     400
1       500     600
1       600     700
1       800     830
2       800     900
2       900     930
END DATA.
LIST.

* предположим, что файл уже отсортирован должным образом.
MATCH FILES FILE=* /BY id /FIRST=first /LAST=last.
CREATE time1a= LEAD(time1,1).
CREATE time2a= LAG(time2,1).

* identify the beginning of a period.
DO IF first.
COMPUTE beg1=1.
ELSE.
COMPUTE beg1=time1<>time2a.
END IF.

* Определим концы непрерывных отрезков времени.
DO IF last.
COMPUTE end1=1.
ELSE.
COMPUTE end1=time2<>time1a.
END IF.

* Запомним значения времени, которыми заканчиваются непрерывные отрезки.
DO IF end1.
COMPUTE val2=time2.
END IF.

* Скопируем концевые значения во все пустые ячейки val2 непрерывного отрезка времени.
COMPUTE casenb=$CASENUM.
SORT CASES BY casenb(D).
IF MISSING(val2) val2=LAG(val2).
SORT CASES BY casenb.

* Оставим теперь только нужные строки.
SELECT IF beg1=1.
MATCH FILES FILE=*  /KEEP=id time1 val2.
RENAME VARIABLES (val2=time2).
FORMATS id time1 time2 (F8.0).
EXECUTE.