【问题标题】:Select Row with MAX value while using another GROUP BY在使用另一个 GROUP BY 时选择具有 MAX 值的行
【发布时间】:2015-07-01 23:14:29
【问题描述】:

我是学习 SQL 的新手,所以我提前道歉是我的问题很初级。

我要做的是显示一个列,告诉我在已区分的“old_country”和“young_country”组中,percent_aged_over_60 分别具有最高和最低值的国家/地区:

SELECT
    CASE
        WHEN percent_aged_over_60 >= 10 THEN "old_country"
        WHEN percent_aged_over_60 < 10 THEN "young_country"
        ELSE "error"
    END AS "oldness",
COUNT(*)
FROM countries_by_population
    GROUP BY oldness;

换句话说,我希望添加一个列来告诉我国家名称,MAX(percent_aged_over_60) 表示“old_country”,MIN(percent_aged_over_60) 表示“young_country”。

虽然我确信这最容易作为两个单独的查询来完成,但我想在同一个查询中执行此操作。

因此,我正在寻找产生三列的结果 - oldness、count(*) 和 country。

【问题讨论】:

  • 如果你只是展示一个古老的国家和一个年轻的国家,COUNT(*) 是干什么用的?
  • 是的。也许每个人都做 MAX 会更容易

标签: mysql sql sqlite


【解决方案1】:

使用这个查询:

select t.country,t.oldness,count(*) from
(SELECT
 CASE
        WHEN percent_aged_over_60 >= 10 THEN "old_country"
        WHEN percent_aged_over_60 < 10 THEN "young_country"
        ELSE "error"
 END AS oldness
 , country
  ,*
 FROM countries_by_population) as t
 GROUP BY t.oldness,t.country;

【讨论】:

  • “t.____”是干什么用的?
  • @dlilienfeld 以便更好地理解查询。您可以放心地忽略它们。
  • @dlilienfeld 在上面一点你可以看到(an entire query) as t。这意味着该查询的结果将用作一个名为t 的临时表。 t.oldnesst.country 是此临时表中的列。
【解决方案2】:

使用子查询获取最小和最大百分比,然后将其与表连接以获取匹配它们的国家/地区。

SELECT country,
        CASE
            WHEN percent_aged_over_60 >= 10 THEN "old_country"
            ELSE "young_country"
        END AS oldness,
        percent_aged_over_60
FROM countries_by_population
JOIN (SELECT MAX(percent_aged_over_60) AS max_pct, MIN(percent_aged_over_60) AS min_pct
      FROM countries_by_population) AS x
ON percent_aged_over_60 >= 10 AND percent_aged_over_60 = max_pct
    OR percent_aged_over_60 < 10 AND percent_aged_over_60 = min_pct

DEMO

【讨论】:

  • 在 HAVING 子句之前不需要 GROUP BY 吗?
  • 如果您希望聚合函数应用于整个结果集,则不要。
  • 我已经更正了答案。我需要在子查询中做 MAX 和 MIN。
猜你喜欢
  • 2020-12-23
  • 1970-01-01
  • 1970-01-01
  • 2018-08-07
  • 2021-08-02
  • 2015-11-11
  • 2013-01-26
  • 1970-01-01
  • 2010-11-21
相关资源
最近更新 更多