SQL 子查询 PostgreSQL 12
SQL subqueries PostgreSQL 12
我有一个 table 类似于:
第一
最后
日期
位置
约翰
母鹿
18-03-2021
哈里斯
陶工
10-06-2021
约翰
母鹿
10-05-2021
哈里斯
陶工
14-06-2021
杰西卡
陶工
14-06-2021
克米特
福斯特
使用案例如下:
- pos 列对应于阳性 covid 测试
- 日期栏对应接种日期
要获得 covid 证书的资格,某些人必须:
- 检测呈阳性并接种了 1 剂疫苗
- 已接种 2 剂疫苗
我正在尝试编写 return 我的查询:
totalDose, totalRequieredDose
例如:
- 如果他检测呈阳性,则 totalRequiredDose 为 1,如果他接种了 1 剂疫苗,则他符合资格。因此,对于哈利波特,totalDoses=1 和 totalRequieredDoses=1 并且是 elligible
- 如果他没有被测试为阳性,则 totalRequiredDose 为 2,如果他接种了 2 次疫苗,他就有资格。因此,对于 John Doe,totalDoses=2 和 totalRequieredDoses=2 并且符合条件
第一
最后
总剂量
总需要剂量
约翰
母鹿
2
2
哈里斯
陶工
1
1
杰西卡
陶工
1
2
克米特
福斯特
0
2
由于 Jessica Potter 已经接种了疫苗但没有提交日期,她必须接种 2 次疫苗。
所以价值 1/2
Kermit foster 没有 pos 值,他是 0/2
等等
我正在绞尽脑汁写一个查询(或 pl/sql),它可以 return 我 table.
有人可以给我一些提示吗?
我们可以按名字和姓氏汇总。总剂量只是非 NULL
疫苗接种日期的计数。对于所需的总剂量数,我们可以从值 2 开始。假设 pos
列存在非 NULL
日期,则该值可以被 1 抵消,表明给定的人在某些时候检测呈阳性。
SELECT
first,
last,
COUNT(date) AS totalDoses,
2 - (COUNT(*) FILTER (WHERE pos IS NOT NULL) > 0)::int AS totalRequieredDoses
FROM yourTable
GROUP BY
first,
last
ORDER BY
COUNT(date) DESC,
first,
last;
我有一个 table 类似于:
第一 | 最后 | 日期 | 位置 |
---|---|---|---|
约翰 | 母鹿 | 18-03-2021 | |
哈里斯 | 陶工 | 10-06-2021 | |
约翰 | 母鹿 | 10-05-2021 | |
哈里斯 | 陶工 | 14-06-2021 | |
杰西卡 | 陶工 | 14-06-2021 | |
克米特 | 福斯特 |
使用案例如下:
- pos 列对应于阳性 covid 测试
- 日期栏对应接种日期
要获得 covid 证书的资格,某些人必须:
- 检测呈阳性并接种了 1 剂疫苗
- 已接种 2 剂疫苗
我正在尝试编写 return 我的查询: totalDose, totalRequieredDose
例如:
- 如果他检测呈阳性,则 totalRequiredDose 为 1,如果他接种了 1 剂疫苗,则他符合资格。因此,对于哈利波特,totalDoses=1 和 totalRequieredDoses=1 并且是 elligible
- 如果他没有被测试为阳性,则 totalRequiredDose 为 2,如果他接种了 2 次疫苗,他就有资格。因此,对于 John Doe,totalDoses=2 和 totalRequieredDoses=2 并且符合条件
第一 | 最后 | 总剂量 | 总需要剂量 |
---|---|---|---|
约翰 | 母鹿 | 2 | 2 |
哈里斯 | 陶工 | 1 | 1 |
杰西卡 | 陶工 | 1 | 2 |
克米特 | 福斯特 | 0 | 2 |
由于 Jessica Potter 已经接种了疫苗但没有提交日期,她必须接种 2 次疫苗。 所以价值 1/2 Kermit foster 没有 pos 值,他是 0/2 等等
我正在绞尽脑汁写一个查询(或 pl/sql),它可以 return 我 table.
有人可以给我一些提示吗?
我们可以按名字和姓氏汇总。总剂量只是非 NULL
疫苗接种日期的计数。对于所需的总剂量数,我们可以从值 2 开始。假设 pos
列存在非 NULL
日期,则该值可以被 1 抵消,表明给定的人在某些时候检测呈阳性。
SELECT
first,
last,
COUNT(date) AS totalDoses,
2 - (COUNT(*) FILTER (WHERE pos IS NOT NULL) > 0)::int AS totalRequieredDoses
FROM yourTable
GROUP BY
first,
last
ORDER BY
COUNT(date) DESC,
first,
last;