Mysql - нужна помощь с запросом IMPALA

У меня есть одна таблица в кусте 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?

заранее спасибо


person Poonam Bhatt    schedule 06.02.2014    source источник
comment
количество вхождений поля name ограничено 3 или оно динамическое???   -  person NoobEditor    schedule 06.02.2014


Ответы (3)


Если вы используете 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.

person Jeff Hammerbacher    schedule 27.04.2014

Вы можете использовать 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;
person Marvin Meyers    schedule 29.11.2014

Мне было трудно понять ваш вопрос, но если я вас правильно понял, вы пытаетесь получить список всех сумм по именам. Если это так, в MySQL это довольно просто:

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

Это даст вам строку для каждого имени со всеми суммами, связанными с этим именем.

person kbcmdba    schedule 07.02.2014