Hive 得到最小值的唯一值

Hive 得到最小值的唯一值,hive,hiveql,Hive,Hiveql,我在蜂箱中有这个表测试 +----------+-------+-------+ | name | price | notes | +----------+-------+-------+ | product1 | 100 | | | product1 | 200 | note1 | | product2 | 10 | note2 | | product2 | 5 | note2 | +----------+-------+-------+ 我希望得到

我在蜂箱中有这个表
测试

+----------+-------+-------+
|   name   | price | notes |
+----------+-------+-------+
| product1 |   100 |       |
| product1 |   200 | note1 |
| product2 |    10 | note2 |
| product2 |     5 | note2 |
+----------+-------+-------+
我希望得到这个结果(不同于最低价格的产品)

我无法使用以下查询,因为
product1
中的
注释不同

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

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

删除分组依据中的
注释
,然后重试:-

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

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;

你可以在蜂箱里用它来做

查询

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
输出

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

这也可以使用子查询找到

    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次迭代,不建议用于较大的表

对于较大的表格,请参见答案:


如果您的产品具有最低价格,那么如何定义要返回的正确值?请记住,最低价格行可能不是唯一的。是否也要按注释分组?这不是有效的SQL。我不知道这是什么,但如果您尝试在配置单元外壳中执行查询,它将不会运行。问题没有
impala
标记。我不明白这将添加哪些其他信息。如果要实现次优解决方案,需要进行权衡(例如代码要短得多)。无论表大小如何,都没有很好的理由用自联接(如果您可以访问窗口函数)来解决这个问题。我觉得子查询方法将帮助新用户了解内部发生的情况。子查询是窗口分区所做的。最小(价格)超过(按名称划分)。子查询B是常规的select*。现在,我们在外部select查询中合并它们。这根本不是内部发生的事情。如果是这样,那么两个查询的运行时间将完全相同。事情就是这样。