Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

sumSimpleState

説明

SimpleState コンビネータは、sum 関数に適用して、すべての入力値の合計を返すことができます。結果は SimpleAggregateFunction 型で返されます。

使用例

賛成票と反対票の追跡

投稿に対する投票を追跡するテーブルを使った、実用的な例を見てみましょう。 各投稿について、賛成票、反対票、および 全体のスコアの累積合計を維持したいとします。sum と組み合わせた SimpleAggregateFunction 型は、 この用途に適しています。必要なのは集計の完全な状態 ではなく、累積合計だけを保存することだからです。その結果、 より高速になり、部分的な aggregate states のマージ も不要になります。

まず、生データ用のテーブルを作成します:

Querysql
CREATE TABLE raw_votes
(
    post_id UInt32,
    vote_type Enum8('upvote' = 1, 'downvote' = -1)
)
ENGINE = MergeTree()
ORDER BY post_id;

次に、集計データを保存するターゲットテーブルを作成します。

CREATE TABLE vote_aggregates
(
    post_id UInt32,
    upvotes SimpleAggregateFunction(sum, UInt64),
    downvotes SimpleAggregateFunction(sum, UInt64),
    score SimpleAggregateFunction(sum, Int64)
)
ENGINE = AggregatingMergeTree()
ORDER BY post_id;

次に、SimpleAggregateFunction 型のカラムを持つmaterialized viewを作成します。

CREATE MATERIALIZED VIEW mv_vote_processor TO vote_aggregates
AS
SELECT
  post_id,
  -- sum状態の初期値(upvoteの場合は1、それ以外は0)
  toUInt64(vote_type = 'upvote') AS upvotes,
  -- sum状態の初期値(downvoteの場合は1、それ以外は0)
  toUInt64(vote_type = 'downvote') AS downvotes,
  -- sum状態の初期値(upvoteの場合は1、downvoteの場合は-1)
  toInt64(vote_type) AS score
FROM raw_votes;

サンプルデータの挿入:

INSERT INTO raw_votes VALUES
    (1, 'upvote'),
    (1, 'upvote'),
    (1, 'downvote'),
    (2, 'upvote'),
    (2, 'downvote'),
    (3, 'downvote');

SimpleState コンビネータ を使用して materialized view に対してクエリを実行します:

SELECT
  post_id,
  sum(upvotes) AS total_upvotes,
  sum(downvotes) AS total_downvotes,
  sum(score) AS total_score
FROM vote_aggregates -- ターゲットテーブルにクエリを実行する
GROUP BY post_id
ORDER BY post_id ASC;
┌─post_id─┬─total_upvotes─┬─total_downvotes─┬─total_score─┐
│       1 │             2 │               1 │           1 │
│       2 │             1 │               1 │           0 │
│       3 │             0 │               1 │          -1 │
└─────────┴───────────────┴─────────────────┴─────────────┘

関連項目

Navigation