impala查询帮助

41zrol4v  于 2021-06-26  发布在  Impala
关注(0)|答案(3)|浏览(425)

我在 hive 里有一张table table1 . 我正在使用impala从表中获取数据

table1
------
name, amount

表的值是

test1, 10
test1, 15
test1, 30

test2, 30
test2, 40
test2, 50

test3, 30
test3, 40
test3, 50

现在我必须从表1中获取数据,这样,它就可以为所有人获取数据
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?

提前谢谢

bxjv4tth

bxjv4tth1#

我很难理解你的问题,但如果我理解正确的话,你是想按名字列出所有金额。如果是这样的话,在mysql中,这非常简单:

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

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

7jmck4yq

7jmck4yq2#

你可以用 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;
uujelgoq

uujelgoq3#

如果您使用的是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,那么似乎可以使用用户定义的变量来伪造窗口函数,如关于stackoverflow的另一个问题所示。

相关问题