【问题标题】:hive - how to select top N elements for each matchhive - 如何为每个匹配选择前 N 个元素
【发布时间】: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) 中提及的所需输出。

【问题讨论】:

    标签: hive hiveql


    【解决方案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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-07
        • 2018-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-28
        相关资源
        最近更新 更多