Sql 不使用ROW_NUMBER()或RANK()从每个组获取第一条记录

Sql 不使用ROW_NUMBER()或RANK()从每个组获取第一条记录,sql,hiveql,Sql,Hiveql,由于配置单元软件的限制,我不能奢侈地使用RANK()、PARTITION BY和OVER() 我要做的是从每个组中检索第一行 表架构如下所示: # Field, Type, Null, Key, Default, Extra 'prod_id', 'int(11)', 'NO', 'PRI', NULL, '' 'brand', 'varchar(20)', 'YES', '', NULL, '' 'name', 'varchar(75)', 'YES', '', NULL, '' 'price

由于配置单元软件的限制,我不能奢侈地使用RANK()、PARTITION BY和OVER()

我要做的是从每个组中检索第一行

表架构如下所示:

# Field, Type, Null, Key, Default, Extra
'prod_id', 'int(11)', 'NO', 'PRI', NULL, ''
'brand', 'varchar(20)', 'YES', '', NULL, ''
'name', 'varchar(75)', 'YES', '', NULL, ''
'price', 'int(11)', 'YES', '', NULL, ''
'cost', 'int(11)', 'YES', '', NULL, ''
'shipping_wt', 'smallint(6)', 'YES', '', NULL, ''
我目前通过SQL的解决方案是:

select brand,name,price from 
(select brand,name,price,row_number() 
over(partition by brand order by price desc) as rn 
from products) as sub 
where rn=1;

如果没有上述函数和关键字,该如何操作?

您可以使用
join
和聚合:

select p.*
from products p join
     (select p.brand, min(p.price) as min_price
      from products p
      group by p.brand
     ) pp
     on p.brand = pp.brand and p.price = pp.min_price;
这实际上相当于
rank()
,而不是
row\u number()
,但如果没有重复的价格,这是相同的


不过,我强烈建议使用窗口函数。它们不仅是标准配置,也是Hive不可或缺的一部分,而且速度也应该更快。

什么是“由于Hive软件的限制”?这些功能已经成为Hive的一部分很长很长时间了。不是在Hive0.10中,窗口功能从0.11开始就得到了官方支持。链接-。Hive 0.11于2013年发布。那是很久以前的事了,我明白。我真的很难过不能使用窗口功能。谢谢你的帮助。