3

病院のグループに入院した患者の記録を含むテーブルがあります。

前のレコードがある場合は各患者の最新の前のレコードに各レコードをリンクできるようにしたいと思います。前のレコードがない場合は null フィールドを返します。

これに加えて、リンクされた記録のいくつかの基準を設定したいと思います。たとえば、同じ病院への以前の訪問のみ、以前の訪問は 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

1

同じ患者の最初の 2 つのレコードが表示されます。同じ病院が必要な場合は、 を使用して別の病院のチェックを追加しPatientIDます。日付も追加できます。

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

エントリが 1 つしかない場合は、1 つのレコードのみが表示されます。

于 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 に答える