【问题标题】:SQL subqueries PostgreSQL 12SQL 子查询 PostgreSQL 12
【发布时间】:2021-06-12 15:50:28
【问题描述】:

我有一张类似这样的桌子:

first last date pos
john doe 18-03-2021
harris potter 10-06-2021
john doe 10-05-2021
harris potter 14-06-2021
jessica potter 14-06-2021
kermit foster

用例如下:

  • pos 列对应于阳性 covid 测试
  • 日期栏对应疫苗接种日期

要获得 covid 证书,某人必须:

  • 检测呈阳性并接种了 1 种疫苗
  • 已接种 2 次疫苗

我正在尝试编写一个返回我的查询: 总剂量,总要求剂量

例如:

  • 如果他的检测结果呈阳性,则 totalRequiredDose 为 1,如果他接种了 1 次疫苗,则他符合资格。因此,对于哈利波特,totalDoses=1 和 totalRequieredDoses=1 是符合条件的
  • 如果他没有被检测出阳性,totalRequiredDose 是 2,如果他接种了 2 次疫苗,他是合格的。因此,对于 John Doe,totalDoses=2 和 totalRequieredDoses=2 是符合条件的
first last totalDoses totalRequieredDoses
john doe 2 2
harris potter 1 1
jessica potter 1 2
kermit foster 0 2

由于 Jessica Potter 接种了疫苗并且没有邮寄日期,因此她必须接种 2 次疫苗。 所以值 1/2 而 Kermit Foster 没有 pos 值,他是 0/2 等等。

我正在挠头写一个查询(或 pl/sql),它可以返回给我这样的表。

有人可以给我一些提示吗?

【问题讨论】:

  • 你的第二个例子似乎是关于错误的人。这让读者有点困惑
  • @Serg 我已经更正了。感谢您的反馈

标签: sql postgresql postgres-12


【解决方案1】:

我们可以按名字和姓氏进行汇总。总剂量只是非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;

Demo

【讨论】:

  • 非常感谢,我正在测试。很快就会恢复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-22
  • 2020-03-13
  • 2021-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多