3

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

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

除此之外,我想放置一些链接记录的标准,例如之前仅访问同一家医院,之前的访问时间少于 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 

我的想法是自我加入,但我不知道如何加入记录,其中入院日期与患者先前出院日期之间的差异最小。

谢谢!

4

3 回答 3

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

在查询结束时。

于 2013-06-05T05:05:33.737 回答
1

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

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

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

于 2013-06-05T05:06:00.880 回答
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;
于 2013-06-05T05:58:33.760 回答