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 小时内的那些访问。
我假设 dischargetime
和 arrivaltime
是 timestamp
类型以简化代码,但您始终可以自己进行转换。
上一个回答
使用 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 值不同来排除相同的访问。
我正在我们的 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 小时内的那些访问。
我假设 dischargetime
和 arrivaltime
是 timestamp
类型以简化代码,但您始终可以自己进行转换。
上一个回答
使用 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 值不同来排除相同的访问。