sql - 获取比 SQLite3 中的 AVG(子查询)更大的(子查询)列表
问题描述
考虑下表:
covid_data(
CASES INT,
DEATHS INT,
COUNTRIES VARCHAR(64),
);
我正在尝试获取死亡率高于 AVG 死亡率的国家/地区的名称。我用来根据每 1000 个病例计算死亡人数的公式是:(死亡人数 / 病例数)* 1000 要获得 AVG,我使用以下查询:
SELECT AVG(rate)
FROM (
SELECT CAST(SUM(deaths) AS FLOAT) / SUM(cases) * 1000 AS rate
FROM covid_data
) covid_data;
要列出比率高于此 AVG 的国家/地区,这是我迄今为止尝试过的众多尝试之一。
SELECT countries, CAST(SUM(deaths) AS FLOAT) / SUM(cases) * 1000 AS RATEM
FROM covid_data
GROUP BY countries
HAVING RATEM > (SELECT AVG(RATE)
FROM (
SELECT CAST(SUM(DEATHS) AS FLOAT) / SUM(CASES) * 1000 AS RATE
FROM covid_data
) covid_data);
这将返回一个错误:没有这样的列:RATEM
正如你所看到的,我正在努力解决这个基本概念,我也很感激任何书籍/课程/资源,以更好地理解这种关系。
解决方案
您可以使用窗口函数:
SELECT cd.country
FROM (SELECT cd.*,
SUM(deaths * 1.0) OVER () / SUM(cases) OVER () as mortality_ratio
FROM covid_data
) cd
WHERE (deaths * 1.0 / NULLIF(cases, 0)) > mortality_ratio;
请注意,每个国家/地区的平均死亡率与总体死亡率不同。我想你明白这一点,但我只想强调这一点。平均比率为:
AVG(deaths * 1.0 / NULLIF(cases, 0))
推荐阅读
- c# - 如何向新添加的连接器添加标签以及如何获取 beginItem 标签和 EndItem 标签?
- python - 在 /admin/login/ 出现 OperationalError 错误没有这样的表:auth_user
- c# - 在 ASP.NET Core 中正确实现 NRT
- google-apps-script - 更改发件人姓名从电子表格创建日历邀请
- assembly - 如何在装配中进行十六进制偏移计算
- c++ - 为什么添加两个值在运行时会有如此高的可变性?
- c++ - 树的节点之间的最大距离中的运行时错误
- python - 类似于 R 的 bpa(基本模式分析)的 Python 包 - 包
- javascript - 如何获取表字段的 SUM?- Angularjs 和 Sqlite
- python-3.x - len和size的区别