2015-10-21 4 views
0

У меня есть эта таблица test in Hive.Получите отличное от минимального значения

+----------+-------+-------+ 
| name | price | notes | 
+----------+-------+-------+ 
| product1 | 100 |  | 
| product1 | 200 | note1 | 
| product2 | 10 | note2 | 
| product2 |  5 | note2 | 
+----------+-------+-------+ 

и я ожидаю, чтобы получить этот результат (отчетливый продуктов с минимальной ценой)

+----------+-------+-------+ 
| name | price | notes | 
+----------+-------+-------+ 
| product1 | 100 |  | 
| product2 |  5 | note2 | 
+----------+-------+-------+ 

Я не могу использовать следующий запрос из-за различную notes в product1.

SELECT name, MIN(price), notes 
FROM test 
GROUP BY name, notes; 

+----------+-------+-------+ 
| name | price | notes | 
+----------+-------+-------+ 
| product1 | 100 |  | 
| product1 | 200 | note1 | 
| product2 |  5 | note2 | 
+----------+-------+-------+ 
+0

Если вы имели свою продукцию с их ценами мин, что определяет правильное значение для возврата в записке? Помня, что минимальная ценовая строка может быть не уникальной. –

ответ

0

notes Удалить в группе и попробуйте еще раз: -

SELECT name, MIN(price), notes 
FROM test 
GROUP BY name 

Run Code

+0

Собираетесь вместе по нотам? – Drew

+0

это недопустимо SQL. – gobrewers14

+0

http://sqlfiddle.com/#!9/73cd5/1 @ GoBrewers14 –

0

Попробуйте

SELECT name, 
SUBSTRING_INDEX(GROUP_CONCAT(price ORDER BY price DESC),',',1) AS min_price, 
SUBSTRING_INDEX(GROUP_CONCAT(notes ORDER BY price DESC),',',1) AS note_value 
FROM test 
GROUP BY name; 
+0

Вопрос не имеет тега 'impala'. – gobrewers14

0

Вы можете сделать это в улье с windowing functions.

Запрос:

select distinct name 
    , min_price 
    , notes 
from (
    select * 
    , min(price) over (partition by name) num_price 
    from db.table) x 
where min_price = price 

Выход:

product1 100   
product2 5  note2 
0

Это может быть найдена с использованием подзапроса, а также.

hive> select A.name,A.price,B.notes from (select name,min(price) as price from products group by name) as A 
inner join (select name,price,notes from products) as B 
on a.name = b.name and a.price = b.price; 

Этот запрос даст результат, как:

product1  100 
product2  5  note2 

Но, то suquery подход имеет 2 итерации над одной и той же таблицей и не рекомендуется для больших таблиц.

Для больших таблиц см @GoBrewers14 ответ:

hive> select name,price,notes from (select *, min(price)over(partition by name) as min_price from products) as a 
    > where a.price = a.min_price; 
+0

Я не понимаю, какую дополнительную информацию это добавляет. Если вы собираетесь внедрить субоптимальное решение, там должен быть компромисс (например, код намного короче). Нет никакой веской причины, чтобы когда-либо решить эту проблему с помощью самостоятельного объединения (если у вас есть доступ к функциям окна), независимо от размера таблицы. – gobrewers14

+0

Я чувствовал, что подзапрос поможет новым пользователям понять, что происходит внутри. Подзапрос A - это то, что делает оконный раздел. мин (цена) над (раздел по имени). Подзапрос B - это регулярный выбор *. Теперь мы объединим их во внешнем запросе select. – Tammy

+0

Это совсем не то, что происходит внутри страны. Если это так, то оба запроса будут иметь одинаковое время выполнения. [Здесь] (https://github.com/apache/hive/blob/master/ql/src/java/org/apache/hadoop/hive/ql/udf/ptf/WindowingTableFunction.java) - это то, что происходит. – gobrewers14

Смежные вопросы