如何选择 21 天(或更早)前的记录? (sqlite)
Posted
技术标签:
【中文标题】如何选择 21 天(或更早)前的记录? (sqlite)【英文标题】:How do I select records from 21days (or more) ago? (sqlite) 【发布时间】:2021-04-16 02:28:19 【问题描述】:我正在尝试选择已接受一剂 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 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 将第一个查询与第二个查询结合起来,认为这应该给我正在寻找的一个案例,但我认为我忽略了一些东西?
【问题讨论】:
【参考方案1】:在最新版本的 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
生成每个人的疫苗接种记录数。然后,在下面的查询中,我们将限制为只出现一次共接种疫苗的人,以及从当前日期起 21 天或更长时间的单次接种日期。
【讨论】:
以上是关于如何选择 21 天(或更早)前的记录? (sqlite)的主要内容,如果未能解决你的问题,请参考以下文章
实训第三天记录-sqli-lab7-11+upload-lab1-3
在 Firefox 60 或更早版本中为 SVG 剪辑路径设置动画时出现随机方块