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
*Слияние двух файлов по вхождению дат.SPS

* ВОПРОС.
Мне требуется слить два файла по определённому ключу. 

Этот ключ (patient_id - код пациента) в файле 1 может встречаться несколько раз (неуникален). 
Мне требуется слить по этому ключу первый файл и файл 2. 

Но в файле 2 ключ patient_id также неуникален. Однако, есть вспомогательный ключ, admission_id - код поступления при госпитализации, который является уникальным. 
Так, пациент 1 может быть госпитализирован более одного раза (каждый раз с разным admission_id), но при этом код пациента (patient_id) остаётся тем же. 
Таким образом, сопоставить эти два файла проблематично. Однако, имеется дополнительная информация, в частности - информация о датах.

В файле 1: имеется дата взятия анализов.
В файле 2: имеются даты поступления пациента (дата A) и выписки пациента (дата B). 
Мы знаем, что дата взятия анализов должна находиться между датами A и B.

Вопрос: как определить условия слияния?

* ОТВЕТ размещён в новостной группе SPSS, автор: Raynald Levesque, 02.07.2004..
В следущем примере последняя запись в file1 и третья запись в файле file2 не имеют соответствий.
SET MPRINT=no.

DATA LIST LIST /id dtTest otherVar.
BEGIN DATA
1 20030115 2
1 20040215 5
2 20030705 7
2 20031022 5
2 20030101 9
END DATA.
* Отсортируем и пронумеруем записи в пределах каждого id.
SORT CASES BY id dtTest.
COMPUTE idx=SUM(LAG(idx)*(LAG(id)=id),1).
SAVE OUTFILE='c:\\temp\\file1.sav'.

DATA LIST LIST /id admin_id dtIn dtOut.
BEGIN DATA
1 10 20030101 20030201
1 15 20040115 20040315
1 17 20031010 20031210
2 22 20030701 20030710 
2 32 20031001 20031030
END DATA.
SAVE OUTFILE='c:\\temp\\file2.sav'.

* Получим все даты анализов для каждого пациента (id).
GET FILE='c:\\temp\\file1.sav'.
VECTOR dt(3).
COMPUTE dt(idx)=dtTest.
AGGREGATE OUTFILE=*
	/PRESORTED
	/BREAK=id
	/dt1 TO dt3=FIRST(dt1 TO dt3).
MATCH FILES FILE='c:\\temp\\file2.sav'
	/TABLE=*
	/BY=id.
VECTOR dt=dt1 TO dt3.
LOOP #idx=1 TO 3.
DO IF RANGE(dt(#idx),dtIn,dtOut).
- COMPUTE idx=#idx.
- BREAK.
END IF. 
END LOOP.

* Уберём ненужные переменные.
ADD FILES FILE=* /DROP=dt1 TO dt3.
SORT CASES BY id idx.
MATCH FILES FILE=*
	/FILE='c:\\temp\\file1.sav'
	/BY=id idx.
LIST.

*Результат:.
    id admin_id     dtIn    dtOut      idx   dtTest otherVar

    1.00    17.00 20031010 20031210      .        .        .
    1.00    10.00 20030101 20030201     1.00 20030115     2.00
    1.00    15.00 20040115 20040315     2.00 20040215     5.00
    2.00      .        .        .       1.00 20030101     9.00
    2.00    22.00 20030701 20030710     2.00 20030705     7.00
    2.00    32.00 20031001 20031030     3.00 20031022     5.00