2

我在 hive 有一张桌子table1。我正在使用 impala 从表中获取数据

table1
------
name, amount

表的值在哪里

test1, 10
test1, 15
test1, 30

test2, 30
test2, 40
test2, 50

test3, 30
test3, 40
test3, 50

现在我必须从 table1 中获取数据,这样它就可以为 all 获取数据name (test1, test2, test3) but gives only top 2 records based on amount for each name

Can it possible in IMPALa or even in MYSQL?

提前致谢

4

3 回答 3

1

您可以使用regexp_extract来获取串联数量的限制。{1,1}会给你前 2 名。{1,49}会给你前 50 名,等等。

例如(前 2 个):

>select name, regexp_extract(group_concat(cast(amount as string),','), '^(([0-9]+,)<b>{1,1}</b>[0-9]+|[0-9]+)',0) as top_two_amount from (select name, amount from table1 order by name, amount desc) t group by name;
于 2014-11-29T15:49:06.290 回答
1

如果您使用的是 Impala 2.0 或更高版本,则可以使用分析函数来完成此任务:

SELECT name, amount
FROM (SELECT name, amount, row_number() OVER (PARTITION BY name ORDER BY amount DESC) AS pos
      FROM table1) t
WHERE pos < 3;

如果您必须使用 MySQL,您似乎可以使用user-defined variables伪造窗口函数,如StackOverflow 上的另一个问题所示。

于 2014-04-27T00:55:46.297 回答
0

我很难理解您的问题,但如果我理解正确,您正在尝试按名称列出所有金额。如果是这样的话,在 MySQL 中,这很简单:

  SELECT name, GROUP_CONCAT( amount ) AS amounts FROM table1 GROUP BY name ;

这将为每个名称提供一行,其中包含与该名称关联的所有金额。

于 2014-02-07T19:58:10.090 回答