当您无法按未选择的列进行 ORDER BY 时,获取按某个值排序的有限数量的 DISTINCT 字段

Get a limited number of DISTINCT fields ordered by some value when you can't ORDER BY unselected columns

问题

我在 Hive 中有一个 table tmpcalc,如下所示:

| country_name | unemp        |
-------------------------------
| Latvia       | 22           |
| Spain        | 24           |
| Spain        | 21           |
| Austria      | 3            |
| Lithuania    | 20           |
| Belgium      | 5            |
| Greece       | 21           |

我想创建一个查询来检索与最高 unemp 值关联的 3 个不同国家/地区的名称:

Spain
Latvia
Greece

我试过的

通常我希望它能工作:

SELECT DISTINCT(country_name)
FROM tmpcalc
ORDER BY unemp DESC
LIMIT 3;

但是,HiveQL 不允许您按未选择的值进行排序,因此这是不行的。


我通常用这样的方法解决这个问题:

SELECT country_name
FROM (
    SELECT country_name, unemp
    FROM tmpcalc
    ORDER BY unemp DESC) a
LIMIT 3;

此 returns 所有国家/地区的列表按降序排列。但是,我们遇到的问题是“西班牙”在该列表中重复,因为它有两个最高的 3 unemp 值:

Spain
Latvia
Spain

不幸的是,简单地在外部 country_name 字段周围添加 DISTINCT 是行不通的,因为它搞砸了顺序,现在 returns 三个国家按字母顺序排列:

SELECT DISTINCT(country_name)
FROM (
    SELECT country_name, unemp
    FROM tmpcalc
    ORDER BY unemp DESC) a
LIMIT 3;
Austria
Belgium
Greece

这是我找到的最简单的答案:

SELECT country_name
FROM (
   SELECT country_name, MAX(unemp) AS unemp
   FROM tmpcalc
   GROUP BY country_name
   ORDER BY unemp DESC LIMIT 5
);

重要的一点是在应用限制之前删除来自一个国家的所有条目,除了最高的国家(通过 MAXGROUP BY)。