首页 > 解决方案 > 获取比 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

正如你所看到的,我正在努力解决这个基本概念,我也很感激任何书籍/课程/资源,以更好地理解这种关系。

标签: sqldatabasesqliterelational-database

解决方案


您可以使用窗口函数:

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))

推荐阅读