POSTGRESQL比较行间的时间重叠

时间:2016-02-24 18:30:03

标签: postgresql self-join

我在EHR中创建了一个查询。我正在寻找那些帐户彼此相隔48小时以确保他们不会再出现相同症状的患者。

使用i在两个表中有以下列

  

访问表

     

' patnum'这是每次访问所附的唯一编号   ' mr_num'这是每位患者的唯一编号

  

er_log表

     

' patnum'这是每次访问所附的唯一编号   到达时间和到达时间,我将在一个时间戳中联合起来,当患者出现时   出院和出院时间,我将在时间戳中联合起来,并且是在病人出院时

1.在所有mr_num帐户中比较到货时间和卸货时间以及找到差异小于48小时的帐户有哪些方法?

谢谢!

编辑:我的解释可能有点模糊 示例pt与MR num' 334455'是ER的常客。她在过去7个月里来过25次。每次访问都有一个独特的patnum,一个到达日期和一个出院日期。我试图通过比较一个访问日期和每个其他访问到达日期来查找她的访问是否在48小时内发生。查询将报告彼此48小时内的访问次数。

2 个答案:

答案 0 :(得分:1)

我假设dischargetimearrivaltime类型为timestamp以简化代码,但您可以随时自行完成转换。

上一个回答

使用INNER JOIN连接包含您时代的表格。假设患者只有在自己出院后才能出院,您可以从arrivaltime中减去dischargetime以获得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

当前回答

评论和编辑问题后的代码更改。这将扫描特定患者的所有访问,并返回在任何先前访问结束后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'
  )

答案 1 :(得分:0)

您需要做的是对ER_LOG表执行两个内部联接。我将借用之前的答案并将其扩展:

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表才能获得两次不同的访问,以便您可以比较时间。您还必须再次加入访问以建立对同一患者(mr_num)的访问,并且您可以通过确保patnum值不同来排除相同的访问。