我如何 select 21 天(或更多)前的记录? (sqlite)
How do I select records from 21days (or more) ago? (sqlite)
我正在尝试 select 接受过一剂 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, fname, lname
HAVING count(vac_date)=1
NHI_id
fname
lname
vac_date
16120419
Colette
Carey
2021-04-15
16120427
Aretha
Livingston
2021-04-02
16120428
Clayton
Marsh
2021-03-31
16120433
Taylor
Buckley
2021-03-20
并且此查询 select 是除第二剂到期的一个人之外的所有人:
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, fname, lname) cnt
FROM Patients
NATURAL JOIN Vaccinations
NATURAL JOIN Vaccines
WHERE vaccine_name = 'Comirnaty'
)
SELECT NHI_id, fname, lname, vac_date
FROM cte
WHERE cnt = 1 AND vac_date < date('now', '-21 days');
上面的 CTE 使用 COUNT
来计算每个人的疫苗接种记录数。然后,在下面的查询中,我们限制只出现一次 Comirnaty 疫苗的人,以及从当前日期起 21 天或更长时间的单次疫苗接种日期。
我正在尝试 select 接受过一剂 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, fname, lname
HAVING count(vac_date)=1
NHI_id | fname | lname | vac_date |
---|---|---|---|
16120419 | Colette | Carey | 2021-04-15 |
16120427 | Aretha | Livingston | 2021-04-02 |
16120428 | Clayton | Marsh | 2021-03-31 |
16120433 | Taylor | Buckley | 2021-03-20 |
并且此查询 select 是除第二剂到期的一个人之外的所有人:
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, fname, lname) cnt
FROM Patients
NATURAL JOIN Vaccinations
NATURAL JOIN Vaccines
WHERE vaccine_name = 'Comirnaty'
)
SELECT NHI_id, fname, lname, vac_date
FROM cte
WHERE cnt = 1 AND vac_date < date('now', '-21 days');
上面的 CTE 使用 COUNT
来计算每个人的疫苗接种记录数。然后,在下面的查询中,我们限制只出现一次 Comirnaty 疫苗的人,以及从当前日期起 21 天或更长时间的单次疫苗接种日期。