以下是方案:表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/
答案 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或其值之间存在某些其他关系,则可以使用if
或case
进行修改。例如,如果C可以为0,但想要将其与C = 1进行分组,则可以执行
(partition by B, if (C < 2,0,1))