如何从键/值SQL表中查找时间窗口内的事件?

问题描述 投票:0回答:1

我将健康记录事件作为键/值存储在 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 time-series duckdb
1个回答
0
投票

这是一个 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
© www.soinside.com 2019 - 2024. All rights reserved.