我将健康记录事件作为键/值存储在 SQL 表中。 例如下表事件.
PATIENT_ID TIMESTAMP DOMAIN KEY VALUE
1 2021-01-01 biology Hemoglobin 11
1 2014-02-05 diagnosis ICD J32
1 2021-01-05 diagnosis ICD J44
2 2021-05-05 biology Iron 133
从这张表中,我想在 1 个月的时间窗口内选择具有以下标准的所有患者:
biology:hemoglobin = '10' AND ( diagnosis:ICD ='J32' OR diagnosis:ICD = 'J44' )
在不考虑时间窗口的情况下,我想我可以将上面的查询转换为以下 SQL 查询:
SELECT patient_id FROM events WHERE domain='biology' AND key='hemoglobin' AND value = '10'
INTERSECT
(
SELECT patient_id FROM events WHERE domain='diagnosis' AND key='ICD' AND value = J32
UNION
SELECT patient_id FROM events WHERE domain='diagnosis' AND key='ICD' AND value = J44
)
但这些条件必须仅在一个时间窗口内成立。我使用 Duckdb,我看到有一个 WINDOW 功能,但我不知道它在这种情况下是否有用。
谢谢
这是一个 SQL Server 解决方案。 duckdb 有不同的 date_add 函数格式:
date_add(日期 '1992-09-15', 间隔 2 个月)
WITH Hem10 as
(
SELECT PATIENT_ID,ts
FROM Events
WHERE [Domain]='biology' AND [Key]='hemoglobin' AND [Value]='10'
)
SELECT *
FROM events e
INNER JOIN Hem10 h on H.Patient_id=e.Patient_ID
WHERE [Domain]='diagnosis' AND [KEY]= 'ICD' AND ( [Value] ='J32' OR [Value] = 'J44' )
AND e.[ts] Between dateadd(month, -1, h.[ts]) AND dateadd(month, 1, h.[ts])
PATIENT_ID | ts | 域名 | 钥匙 | 价值 | PATIENT_ID | ts |
---|---|---|---|---|---|---|
1 | 2021-01-01 | 诊断 | ICD | J44 | 1 | 2021-01-01 |