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
* Устранить дубликаты, сохранив максимум информации.

*(ВОПРОС) Здравствуйте. Имеется массив данных такого вида:

ID               LastName      FirstName      Gender
123              Google        A              F
123              Google                       F
123                                           F
124              Robin         Justin         M
124              Robin         Justin
333              Excite        John
333                                           M

То есть, имеются дублирующие друг друга записи, при этом в некоторых из них имеются 
пропуски в данных. Меня интересует вопрос, как избавиться от дубликатов, при этом 
"не выплеснув с водой ребёнка", то есть, не выкинув наблюдения с полной информацией.
И, возможно, более сложная задача - собрать из разрозненных данных по одному и тому же
ID максимально полную информацию (как в случае с ID 333).
То есть, требуется получить в итоге файл такого вида:

ID               LastName      FirstName      Gender
123              Google        A              F
124              Robin         Justin         M
333              Excite        John           M

*(ОТВЕТ) Размещён в SPSSX-L 16.01.2002, автор: rlevesque@videotron.ca.
* Посетите мой сайт, посвящённый SPSS http://www.spsstools.net

*** NB! Всегда работайте с КОПИЕЙ исходного файла данных!.
DATA LIST FIXED /id 1-3(F) lastname 4-9(A) firstnam 10-15(A) gender 16-16 (A).
BEGIN DATA
123GoogleA	    F
123Google      F
123            F
124Robin JustinM
124Robin Justin
333ExciteJohn
333      John  M 
END DATA.
LIST.

SORT CASES BY id.
DO IF $CASENUM>1.
PRESERVE.
SET ERRORS=no.
DO REPEAT varname=ALL.
* В зависимости от того, буде ли очередная переменная строковой или числовой, 
  одна из следующих двух строк будет давать ошибку. Но зато другая будет делать то,
  что нужно. Ошибки мы скрываем (команда set errors=no выше).
IF id=LAG(id) And RTRIM(varname)="" varname=LAG(varname).
IF id=LAG(id) And MISSING(varname) varname=LAG(varname).
END REPEAT PRINT.
END IF.
RESTORE.

* После выполнения синтаксиса, приведённого выше, последнее наблюдение 
  для каждого ID содержит всю доступную по этому ID информацию.
  Оставляем только его.

MATCH FILES FILE=* /BY id /LAST=last.
SELECT IF last.
LIST.