hive - 如何为每个匹配选择前 N 个元素
Posted
技术标签:
【中文标题】hive - 如何为每个匹配选择前 N 个元素【英文标题】:hive - how to select top N elements for each match 【发布时间】:2018-10-30 00:30:48 【问题描述】:请考虑一个 hive 表 - TableA,如下所述。
当我们想要获取“所有”与 where 子句中的条件匹配的行时,这种基本的 SQL 语法可以正常工作。我想将返回的行限制为一个数字 - 比如 N - 对于 where 子句的每个匹配项。
让我用一个例子来解释:
(1) 考虑这张表:
TableA
c1 c2
1. a
1 b
1 c
2. d
2. e
2. f
(2) 考虑这个查询:
SELECT c1, c2
FROM TableA
WHERE c1 in (1,2)
(3) 你可以想象,它会产生这样的结果:
Actual Results:
c1 c2
1. a
1 b
1 c
2. d
2. e
2. f
(4) 期望的结果:
c1 c2
1. a
1 b
2. d
2. e
问题:如何修改 #2) 中的查询以获得 #4) 中提及的所需输出。
【问题讨论】:
【参考方案1】:您可以使用row_number
函数来执行此操作。
select c1,c2
from (SELECT c1, c2, row_number() over(partition by c1 order by c2) as rnum
FROM TableA
--add a where clause as needed
) t
where rnum <= 2
【讨论】:
【参考方案2】:c1 只有 2 个值
SELECT c1, c2 FROM TableA WHERE c1 = 1 ORDER BY c2 LIMIT 2
UNION ALL
SELECT c1, c2 FROM TableA WHERE c1 = 2 ORDER BY c2 LIMIT 2
超过2个值,使用rank()
select c1,c2 from
(
select c1,c2,rank() over (partition by c1 order by c2) as rank
from TableA
) t
where rank < 3;
【讨论】:
以上是关于hive - 如何为每个匹配选择前 N 个元素的主要内容,如果未能解决你的问题,请参考以下文章
在 HTMX 中,如何为选择表单元素中的每个选项请求特定的 URL?