当您无法按未选择的列进行 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
);
重要的一点是在应用限制之前删除来自一个国家的所有条目,除了最高的国家(通过 MAX
和 GROUP BY
)。
问题
我在 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
);
重要的一点是在应用限制之前删除来自一个国家的所有条目,除了最高的国家(通过 MAX
和 GROUP BY
)。