蜂巢-如何为每个比赛选择前N个元素

时间:2018-10-30 00:30:48

标签: hive hiveql

请考虑配置单元表-TableA,如下所述。

当我们要获取“所有”与where子句中的条件匹配的行时,这种基本的SQL语法可以正常工作。我想将where子句的每个匹配项的返回行限制为一个数字-N。

让我举例说明:

(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)中获得所需的输出提示。

2 个答案:

答案 0 :(得分:1)

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;

答案 1 :(得分: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