首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >查找组中的前n个匹配项,配置单元

查找组中的前n个匹配项,配置单元
EN

Stack Overflow用户
提问于 2019-07-24 20:28:51
回答 1查看 77关注 0票数 1

我有一个表,其中每条记录都有列:标题和类别。我想找到2个标题与最多的出现在他们的类别。有些标题在这两个类别中都列出了。如何在Hive中实现这一点?

下面是一个表创建查询:

代码语言:javascript
运行
复制
create table book(category String, title String) row format delimited fields terminated by '\t' stored as textfile;

和示例数据:

代码语言:javascript
运行
复制
fiction book1
fiction book2
fiction book3
fiction book4
fiction book5
fiction book6
fiction book7
fiction book8
fiction book8
fiction book8
psychology  book1
psychology  book2
psychology  book2
psychology  book2
psychology  book2
psychology  book7
psychology  book7
psychology  book7

预期结果:

代码语言:javascript
运行
复制
fiction book8
fiction any other
psychology  book2
psychology  book7

目前,我已经成功地编写了这个查询:

代码语言:javascript
运行
复制
SELECT * FROM  
(SELECT category, title,
             count(*) as sale_count
             from book
             Group BY category, title) a 
order by category, sale_count DESC; 

这为每个类别中的一个标题提供了计数,但我找不到只返回每个类别中2个顶级记录的方法

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-24 21:55:38

对于只有两个top记录,使用row_number()

代码语言:javascript
运行
复制
select category, title, sale_count
from
(
SELECT a.*,
row_number() over(partition by category order by sale_count desc) rn
 FROM  
(SELECT category, title,
             count(*) as sale_count
             from book
             Group BY category, title) a 
)s where rn <=2

order by category, sale_count DESC; 

如果有多个行具有相同的最高销售额,并且您需要返回两个最高计数的所有最高销售额行,请使用DENSE_RANK而不是row_number,如果存在具有相同sale_count的标题,它将分配相同的排名。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57182968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档