pro c sql присоединиться к SAS, ближайшей к дате - PullRequest
4 голосов
/ 28 февраля 2020

Как можно выполнить соединение «один ко многим» между двумя наборами данных с pro c sql в SAS, чтобы получить запись в наборе данных B, наиболее близкую к значению в наборе данных A?

Набор данных A

#Patient     #Date of Dose
001                 2020-02-01

Набор данных B

# Patient        # Lab Test         #Date of Test     # Value 
001            Test 1           2020-01-17      6
001            Test 1           2020-01-29      10

Я хочу сделать объединение, чтобы выбрать вторую запись в наборе данных B, запись с «датой испытания», которая ближе всего (меньше или равна) к «Дате дозы» в первом наборе данных.

Ответы [ 4 ]

0 голосов
/ 02 марта 2020

Я хочу сделать объединение, чтобы выбрать вторую запись в наборе данных B, запись с «датой теста», которая ближе всего (меньше или равна) к «дате дозы» в первый набор. .

0 голосов
/ 28 февраля 2020

Рассчитайте абсолютную разницу между обеими датами и выберите минимальную дату с предложением having. Вам нужно будет сделать дополнительные логи c, например distinct, чтобы удалить все дубликаты.

proc sql noprint;
    select t1.patient
         , t1.date_of_dose
         , abs(t1.date - t2.date) as date_dif
    from dataset_A as t1
    LEFT JOIN
         dataset_B as t2
    ON t1.patient = t2.patient
    where t1.date <= t2.date
    group by t1.patient
    having calculated date_dif = min(calculated date_dif)
    ;
quit;
0 голосов
/ 28 февраля 2020

попробуйте это:

SELECT TOP 1 *
FROM (
    SELECT DSA.Patient
        ,DSA.Date_Of_Dose
        ,DSB.Date_Of_Test
        ,DATEDIFF(Day, DSA.Date_Of_Dose, DSA.Date_Of_Dose) Diff
    FROM DataSetA DSA
    JOIN DataSetB DSB ON DSA.Patient = DSB.Patient
    ) Data
WHERE ABS(Diff) = MIN(ABS(Diff));

Извините, у меня нет возможности узнать, работает ли это, потому что меня нет дома. Я надеюсь, что это поможет вам.

0 голосов
/ 28 февраля 2020

Я хочу сделать объединение, чтобы выбрать запись [..] в наборе данных B [...] с «датой проверки», которая ближе всего (меньше или равна) к «дате» of Dose "в первом наборе данных.

Вы можете использовать outer appy - если sas поддерживает это:

select a.*, b.*
from a
outer apply(
    select top 1 b.*
    from b 
    where b.patient = a.patient and b.date_of_test <= a.date_of_dose
    order by b.date_of_test desc
) b

Другое решение - присоединиться с условием not exists:

select a.*, b.*
from a
left join b 
    on  b.patient = a.patient
    and b.date_of_test <= a.date_of_dose
    and not exists (
        select 1
        from b b1
        where 
            b1.patient = a.patient
            and b1.date_of_test <= a.date_of_dose
            and b1.date_of_test > b.date_of_test 
    )
...