POSTGRESQL 比较跨行的时间重叠

POSTGRESQL Comparing a time overlap across rows

我正在我们的 EHR 中创建一个查询。我正在寻找账户相隔 48 小时以内的患者,以确保他们不会出现相同的症状。

为了与我一起工作,我在两个表中有以下列

visit table

'patnum' which is the unique number attached to each visit
'mr_num' which is the unique number attached to each patient

.

er_log table

'patnum' which is the unique number attached to each visit
arrivaldt and arrivaltime which i will unite in a timestamp and is when the patient presented themselves
dischargedate and dischargetime which I will unite in a timestamp and is when the patient was discharged

1.what 是否有一些方法可以比较 mr_num 的所有帐户的到达时间和出院时间,并找到差异小于 48 小时的帐户?

谢谢!

编辑:我的解释可能有点含糊 MR 编号为“334455”的示例 pt 是急诊室的常客。在过去的 7 个月里,她来过 25 次。每次访问都有唯一的 patnum、到达日期和出院日期。我试图通过将一个访问日期与其他所有访问到达日期进行比较来确定她的任何访问是否发生在彼此之间的 48 小时内。查询将报告彼此相隔 48 小时内的那些访问。

我假设 dischargetimearrivaltimetimestamp 类型以简化代码,但您始终可以自己进行转换。

上一个回答

使用 INNER JOIN 连接包含您的时间的 table。假设患者只有在他出现后才能出院,您可以从 dischargetime 中减去 arrivaltime 以接收 INTERVAL 类型的结果,并仅返回它们最多相差 2 天的那些行, 即 48 小时。

SELECT 
  v.mr_num, v.patnum
FROM 
  visit v
  INNER JOIN er_log e USING ( patnum )
WHERE 
  v.mr_num = ?
  AND e.dischargetime - e.arrivaltime < interval '2 days'

要获得更深入的了解,您可以查看我创建的 SQL Fiddle

当前答案

评论和编辑问题后的代码更改。这将扫描特定患者的所有就诊以及 return 任何先前就诊结束后 2 天内发生的就诊。您可能希望通过比较发生的行稍微更改逻辑,以更好地满足您的需要

AND e1.dischargetime - e2.arrivaltime < interval '2 days'

并决定是根据 arrivaltime 还是 dischargetime 比较当前访问和查找中的所有访问。

SELECT 
  v.mr_num, v.patnum
FROM 
  visit v1
  INNER JOIN er_log e1 USING ( patnum )
WHERE 
  v.mr_num = ?
  AND EXISTS (
    SELECT 1
    FROM visit v2
    INNER JOIN er_log e2 USING ( patnum )
    WHERE 
      v1.mr_num = v2.mr_num 
      AND v1.patnum IS DISTINCT FROM v2.patnum
      AND e1.dischargetime - e2.arrivaltime < interval '2 days'
  )

您需要做的是对 ER_LOG table 进行两次内部联接。我要借用之前的答案并扩展它:

SELECT 
  v1.mr_num, v1.patnum, v2.patnum,
 (e1.dischargetime - e2.arrivaltime) as elapsed
FROM 
  visit v1
  INNER JOIN er_log e1 on (v1.patnum = e1.patnum)
  INNER JOIN visit v2 on (v1.mr_num = v2.mr_num and v1.patnum <> v2.patnum)
  INNER JOIN er_log e2 on (v2.patnum = e2.patnum)
WHERE 
  v1.mr_num = ?
  AND e1.dischargetime - e2.arrivaltime < interval '2 days'

您必须针对 er_log table 加入两次以获得两次不同的访问,以便您可以比较时间。您还必须再次加入 against visit 以建立对同一患者的访问 (mr_num),并且您可以通过确保 patnum 值不同来排除相同的访问。