HQL如何限制每个组中的记录数?

时间:2013-10-14 06:06:43

标签: hql hive sql-limit

以下是方案:表record如下:

A | B | C

1 | 1 | 1
2 | 1 | 1
3 | 1 | 1
4 | 1 | 2
5 | 1 | 2
6 | 1 | 3

HQL的结果:select * from record where B = 1 and C < 3 limit 2将是:

A | B | C

1 | 1 | 1
2 | 1 | 1

但我想要的是:

A | B | C

1 | 1 | 1
2 | 1 | 1
4 | 1 | 2
5 | 1 | 2

即:要限制每种情况下的记录数,不要限制返回的最终记录数。

我真的需要在中完成。谁能给我一个想法?非常感谢!

汇总 这是解决此问题的好方法: http://ragrawal.wordpress.com/2011/11/18/extract-top-n-records-in-each-group-in-hadoophive/

1 个答案:

答案 0 :(得分:2)

您应该可以使用UNION查询执行此操作。

SELECT A,B,C FROM
(
  SELECT A, B, C FROM record WHERE B = 1 limit 2
  UNION AL L
  SELECT A, B, C FROM record WHERE C < 3 limit 2
)

您没有说明如何显示可以通过这两个条件的行;如果需要,可以将DISTINCT添加到外部SELECT,或者您可能需要添加WHERE子句来处理重叠条件。

(是的,ALL中不应该有空格,但过滤协议拒绝,因为它看起来像sql注入)

选择2

基于评论,似乎用分析功能解决可能更好,因为目标是从每个B&amp;组中获得前2名。 C,约束为B = 1&amp; C&lt; 3。

SELECT S.A, S.B, S.C
FROM
 (SELECT A, B, C, row_number() over (partition by B,C) as r FROM record where B=1 AND C < 3) S
WHERE S.r < 3

这将根据需要给出结果。在这种情况下,因为B = 1,partition by子句中实际上不需要B.但是,如果B或C的限制发生变化,则需要。此外,如果B,C或其值之间存在某些其他关系,则可以使用ifcase进行修改。例如,如果C可以为0,但想要将其与C = 1进行分组,则可以执行

(partition by B, if (C < 2,0,1))