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

どういうわけか、(A、B)の組み合わせではなく、A列だけにHAVING条件を適用できるようにしたいと思います。私の結果は本当に次のようになります。

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

2番目の例で 'HAVING条件を列Aだけに適用する 'ことを説明する必要があります。 d | 1 'なので、それはどのように 'HAVING(a)> 2'に関連しているのですか? –

+0

遅く応答して申し訳ありません。理由は 'a | d | 1 'が出現するのは、 'HAVING'が列Aにだけ適用されるので、aの合計は' 1 + 2 + 1 = 4'であるので、それに参加するものはすべて表示されるべきです( 'a | c'と' a | )。あなたの親切な助けをありがとう。 –

答えて

0

あなたのお問い合わせはokです。

分析関数を使用できますが、パフォーマンスが向上するかどうかはわかりません。計画を説明してみてください。

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 
関連する問題