我在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获取数据,以便获取所有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?
提前致谢
答案 0 :(得分:1)
如果您使用的是Impala 2.0或更高版本,则可以使用analytic functions来完成此任务:
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伪造窗口函数,如another question on StackOverflow中所示。
答案 1 :(得分: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;
答案 2 :(得分:0)
我很难理解你的问题,但如果我理解正确的话,你就会试图按名称列出所有金额。如果是这种情况,在MySQL中,这非常简单:
SELECT name, GROUP_CONCAT( amount ) AS amounts FROM table1 GROUP BY name ;
这将为每个名称提供一行,其中包含与该名称相关联的所有金额。