2016-07-29 48 views
0

是否可以在Vertica中的某些列上使用HAVING子句? 寻找最有效的方式,因为我正在处理数百万行。Vertica - 仅在某些列上使用HAVING进行筛选结果

这里是什么,我试图做一个例子: 鉴于表t:

A | B | number 
--+---+------- 
a | c | 1 
a | c | 2 
a | d | 1 
b | e | 1 
b | e | 1 
c | c | 1 

如果我运行:

SELECT A, B, sum(number) as total 
FROM t 
GROUP BY 1, 2 
HAVING sum(number) >= 2 

我会得到:

A | B | total 
--+---+------ 
a | c | 3 
b | e | 2 

我想以某种方式能够将HAVING条件应用于列A,而不是(A,B)组合,以便我的结果真的会:

A | B | total 
--+---+------ 
a | c | 3 
a | d | 1 
b | e | 2 

想我可以像下面这样做:

SELECT A, B, sum(number) as total 
FROM t 
WHERE A IN (
    SELECT A 
    FROM t 
    GROUP BY 1 
    HAVING sum(number) >= 2 
) 
GROUP BY 1, 2 

但有一个更好的办法?

+0

你必须解释什么是'适用于HAVING条件只是列A'你的第二个例子返回'a | d | 1'那么这与'HAVING(a)> 2'有什么关系?' –

+0

对不起,迟到的回应。原因'a | d | 1'出现是因为'HAVING'只适用于A列,所以a的总数是'1 + 2 + 1 = 4',所以任何参与它的东西都应该出现('a | c'和'a | e')。感谢您的热心帮助。 –

回答

0

您的查询看起来没问题。

您可以使用分析函数,但不知道这是否会提高性能。你应该尝试向我们解释解释计划。

SELECT DISTINCT A, B, total_ab 
FROM (
    SELECT A, 
      B, 
      SUM(number) OVER (partition by A) total_a, 
      SUM(number) OVER (partition by A,B) total_ab 
    FROM t 
    ) X 
WHERE X.total_a >=2