sqlite - 如何选择 21 天(或更早)前的记录?(sqlite)
问题描述
我正在尝试选择已接受一剂 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 | 名称 | 名字 | 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, 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');
上面的 CTECOUNT
用于生成每个人的疫苗接种记录数。然后,在下面的查询中,我们限制只出现一次的人接种共生疫苗,以及从当前日期起 21 天或更长时间的单一疫苗接种日期。
推荐阅读
- mongodb - 我们可以在 terraform 中创建自定义后端吗?
- c# - C#如何找到字符串中的最后一个唯一字母,并获取它的索引?
- sql-server - 使用 SQL 中的外部表/Polybase 从外部源(Azure 存储 Blob)中选择数据。表已创建但未返回数据
- java - 引起:org.jboss.modules.ModuleNotFoundException: javax.enterprise.deploy.api"}}
- java - 我无法创建 JSONObject 的实例
- svg - 菜单中的 SVG 被错误地切断/裁剪
- api - Flutter框架中使用第三方API不断(动态)刷新数据List
- excel - 使用另一个工作表中单元格的位置获取最后一个单元格的值
- java - 将三个不同类的字段映射到一个 json 对象,然后从该 json 创建一个字符串
- apache - 在 Apache 2.4 x64 上运行 ColdFusion 9.02