在SQL中链接来自同一表的后续患者访问

时间:2013-06-05 04:55:37

标签: sql sql-server-2008 self-join

我有一张表格,其中包含患者入院的记录。

我希望能够将每条记录链接到每位患者的最新记录,如果有以前的记录,或者如果没有以前的记录则返回空字段。

除此之外,我想提出一些相关记录的标准,例如之前访问过同一家医院,之前的访问时间不到7天。

数据看起来像这样(包含许多其他字段)

Record   PatientID hospital Admitdate DischargeDate 
1.       1.        A.       1/2/12.   3/2/12
2.       2.        A.       1/2/12.   4/2/12
3.       1.        B.       4/3/12.   4/3/12 

我的想法是自我加入,但我无法弄清楚如何加入记录,其中录取日期与患者之前的出院日期之间的差异是最小的。

谢谢!

3 个答案:

答案 0 :(得分:2)

您可以使用row_number()为每位患者的记录分配不断增加的数字。然后你可以left join到上一条记录:

; with  numbered_records as
        (
        select  row_number() over (partition by PatientID, Hospital
                    order by Record desc) as rn
        ,       *
        from    YourTable
        )
select  *
from    numbered_records cur
left join
        numbered_records prev
on      prev.PatientID = cur.PatientID
        and prev.Hospital = cur.Hospital
        and prev.DischargeDate >= dateadd(day, -7, getdate())
        and prev.rn = cur.rn + 1

要仅选择每位患者的最新行,请添加:

where   cur.rn = 1

在查询结束时。

答案 1 :(得分:1)

它将为您提供相同患者的前2个记录。如果您想要同一家医院,请使用PatientID添加另一张医院检查。也可以添加日期。

SELECT * FROM T1 t
WHERE (2 >= (SELECT Count(*) FROM T1 tmp 
             WHERE t.PatientID = tmp.PatientID 
             AND t.Record <= tmp.Record))

如果只有一个条目,它只会带一条记录。

答案 2 :(得分:1)

请注意:

    我使用DATE作为数据类型。患者可能在中午之前访问一家医院,而另一位患者在下午访问。在这种情况下你可以使用DATETIME。
    分区的排序在record_id之前使用dt_admit,以允许以任何顺序输入数据。

CREATE TABLE #hdata(
  record_id INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
  patient_id INT NOT NULL,
  hospital_id INT NOT NULL,
  dt_admit DATE NOT NULL,
  dt_discharge DATE NULL
);
INSERT INTO #hdata(
  patient_id,
  hospital_id,
  dt_admit,
  dt_discharge
)
VALUES (
  1,
  1,
  '2012-02-01',
  '2012-02-03'
), (
  2,
  1,
  '2012-02-01',
  '2012-02-04'
), (
  1,
  2,
  '2012-03-04',
  '2012-03-04'
);

-- 1/ link each record to the previous record for each patient, NULL if none
SELECT
  record_id,
  patient_id,
  ROW_NUMBER() OVER (PARTITION BY patient_id ORDER BY dt_admit,record_id) AS visit_seq_id
INTO
  #visit_sequence
FROM
  #hdata;

SELECT
  v1.record_id,
  v1.patient_id,
  v2.record_id AS previous_record_id
FROM
  #visit_sequence AS v1
  LEFT JOIN #visit_sequence AS v2 ON
    v2.patient_id=v1.patient_id AND
    v2.visit_seq_id=v1.visit_seq_id-1
ORDER BY
  v1.record_id;

DROP TABLE #visit_sequence;

-- 2/ criteria on linked records: same hospital, previous visit < 7 days
SELECT
  record_id,
  patient_id,
  hospital_id,
  dt_admit,
  ROW_NUMBER() OVER (PARTITION BY patient_id,hospital_id ORDER BY dt_admit,record_id) AS visit_seq_id
INTO
  #visit_sequence_elab
FROM
  #hdata;

SELECT
  v1.record_id,
  v1.patient_id,
  v2.record_id AS previous_record_id
FROM
  #visit_sequence_elab AS v1
  LEFT JOIN #visit_sequence_elab AS v2 ON
    v2.patient_id=v1.patient_id AND
    v2.hospital_id=v1.hospital_id AND
    v2.visit_seq_id=v1.visit_seq_id-1 AND
    DATEDIFF(DAY,v1.dt_admit,v2.dt_admit)<7
ORDER BY
  v1.record_id;

DROP TABLE #visit_sequence_elab;

DROP TABLE #hdata;