hive - 在 Hive 组中查找前 n 次出现
问题描述
我有一个表,其中每条记录都有列:标题和类别。我想找到 2 个在其类别中出现次数最多的标题。一些标题列在这两个类别中。如何在 Hive 中实现这一点?
这是一个表创建查询:
create table book(category String, title String) row format delimited fields terminated by '\t' stored as textfile;
和示例数据:
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
预期结果:
fiction book8
fiction any other
psychology book2
psychology book7
目前我已经设法编写了这个查询:
SELECT * FROM
(SELECT category, title,
count(*) as sale_count
from book
Group BY category, title) a
order by category, sale_count DESC;
这为每个类别中的标题提供了计数,但我找不到从每个类别中仅返回 2 条顶级记录的方法
解决方案
只有两个顶级记录使用 row_number()
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 的标题,它将分配相同的排名。
推荐阅读
- c# - 如何在 foreach 循环中修复 SELECT 语句和 cookie 计数
- python - 为什么查询返回相同的对象并对数据库执行两次查询
- java - 如何修复在包中移动我的 java 文件后出现的错误“java.lang.NoClassDefFoundError”?
- npm - NPM FontAwesome 安装 --dev
- jenkins - 如何通过 Jenkins 脚本控制台设置“扫描组织触发器”?
- bash - 无论字符串是否存在,如何获取匹配字符串后的第一行
- node.js - 连接到旧 API 时出现“tls_process_ske_dhe:dh key too small”错误
- c - 将整数值从 arduino uno 发送到 nodemcu
- react-native - 图像链接中的变量
- r - 在 ubuntu 18.04 上安装 rgdal