2016-07-29 49 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