Vertica - 仅在某些列上使用HAVING过滤结果

时间:2016-07-29 16:47:32

标签: sql having vertica

是否可以仅在我的某些列上使用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

但是有更好的方法吗?

1 个答案:

答案 0 :(得分: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