メインコンテンツへスキップ
メインコンテンツへスキップ

sumSimpleState

説明

sum 関数に SimpleState コンビネータを適用すると、すべての入力値の合計を返します。戻り値の型は SimpleAggregateFunction です。

使用例

賛成票と反対票のトラッキング

投稿に対する投票を追跡するテーブルを使った、実践的な例を見ていきます。 各投稿ごとに、賛成票、反対票、および全体スコアの累積合計を保持したいとします。 このユースケースでは、集計の全状態ではなく累積合計だけを保存すればよいので、 SimpleAggregateFunction 型に sum を組み合わせて使うのが適しています。 これにより処理が高速になり、部分的な集計状態をマージする必要もなくなります。

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

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 型の列を持つマテリアライズドビューを作成します。

CREATE MATERIALIZED VIEW mv_vote_processor TO vote_aggregates
AS
SELECT
  post_id,
  -- 合計状態の初期値(upvoteの場合は1、それ以外は0)
  toUInt64(vote_type = 'upvote') AS upvotes,
  -- 合計状態の初期値(downvoteの場合は1、それ以外は0)
  toUInt64(vote_type = 'downvote') AS downvotes,
  -- 合計状態の初期値(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 コンビネータを使用してマテリアライズドビューに対してクエリを実行します:

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 │
└─────────┴───────────────┴─────────────────┴─────────────┘

関連項目