问题描述
我正在尝试选择已接受一剂 Comirnaty 并且即将接受下一剂(vac_date 为 21 天前或更早)的患者。
以下查询让我知道所有接受过一剂 Comirnaty 的人:
SELECT NHI_id,fname,lname,vac_date
FROM Patients
NATURAL JOIN Vaccinations
NATURAL JOIN Vaccines
WHERE vaccine_name="Comirnaty"
GROUP BY NHI_id,lname
HAVING count(vac_date)=1
NHI_id | 名字 | 名字 | vac_date |
---|---|---|---|
16120419 | 科莱特 | 凯里 | 2021-04-15 |
16120427 | 艾瑞莎 | 利文斯顿 | 2021-04-02 |
16120428 | 克莱顿 | 沼泽 | 2021-03-31 |
16120433 | 泰勒 | 巴克利 | 2021-03-20 |
并且此查询选择每个人,除了第二次注射的那个人:
SELECT NHI_id,vac_date
FROM Vaccinations
WHERE date("Now","-21 days") <= vac_date
NHI_id | vac_date |
---|---|
16120415 | 2021-04-10 |
16120419 | 2021-04-15 |
16120420 | 2021-04-15 |
16120421 | 2021-04-10 |
16120423 | 2021-04-01 |
16120424 | 2021-04-02 |
16120425 | 2021-04-02 |
16120426 | 2021-04-02 |
16120427 | 2021-04-02 |
16120428 | 2021-03-31 |
16120428 | 2021-04-01 |
16120430 | 2021-04-10 |
16120432 | 2021-04-15 |
16120434 | 2021-04-15 |
16120435 | 2021-04-15 |
所以我尝试使用 NOT IN 将第一个查询与第二个查询结合起来,认为这应该给我我正在寻找的一个案例,但我想我忽略了一些东西?
解决方法
在最近版本的 SQLite 上,我会在这里使用 COUNT()
一个分析函数:
WITH cte AS (
SELECT NHI_id,fname,lname,vac_date,COUNT(*) OVER (PARTITION BY NHI_id,lname) cnt
FROM Patients
NATURAL JOIN Vaccinations
NATURAL JOIN Vaccines
WHERE vaccine_name = 'Comirnaty'
)
SELECT NHI_id,vac_date
FROM cte
WHERE cnt = 1 AND vac_date < date('now','-21 days');
上述 CTE 使用 COUNT
生成每个人的疫苗接种记录数量。然后,在以下查询中,我们将 Comirnaty 疫苗限制为仅出现一次的人员,以及自当前日期起 21 天或更长时间的单次接种日期。