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?

hive sql - 如何选择 hive 数组列中的前 n 个元素并返回所选数组

如何为HSQL中的每个组选择列中具有最大值的行?

错位排列及有关例题

每个关系选择前 N 个项目,每个项目一行

如何为带有 $ 符号的 Class 的元素编写选择器