2

场景如下:表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-hadoopive/

4

1 回答 1

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 和 C 的每个分组中获得前 2 名,约束为 B = 1 和 C < 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

这将给出所需的结果。partition by在这种情况下,因为 B=1,所以子句中确实不需要 B。但如果 B 或 C 的限制发生变化,则需要。此外,如果 B、C 或它们的值之间存在其他关系,可以用 aif或进行修改case。例如,如果 C 可以为 0,但想将其与 C=1 分组,您可以这样做

(partition by B, if (C < 2,0,1))
于 2013-10-14T15:54:10.280 回答