2015-10-21 40 views
0

我在Hive中擁有此表test獲取不同的最小值

+----------+-------+-------+ 
| 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是常規選擇*。現在,我們將它們組合到外部選擇查詢中。 – Tammy

+0

這完全不是內部發生的事情。如果是這樣,那麼兩個查詢將具有完全相同的運行時間。 [這裏](https://github.com/apache/hive/blob/master/ql/src/java/org/apache/hadoop/hive/ql/udf/ptf/WindowingTableFunction.java)會發生什麼。 – gobrewers14