sumSimpleState — 모든 입력 값의 합을 단순 상태로 구하기

sumSimpleState — 모든 입력 값의 합을 단순 상태로 구하기

sumSimpleStatesum 함수에 SimpleState 결합자를 적용해서 모든 입력 값의 합을 SimpleAggregateFunction 타입으로 반환하는 방법을 보여드릴게요.

출처: 문서

본문

sum 함수에 SimpleState 결합자를 적용하면 모든 입력 값의 합을 반환해요. 결과는 SimpleAggregateFunction 타입으로 반환해요.

추천수와 반대수 추적하기

게시물에 대한 투표를 추적하는 테이블을 사용하는 실용적인 예제를 살펴볼게요. 각 게시물에 대해 추천수, 반대수, 그리고 전체 점수의 누적 합계를 유지하고 싶다고 해요. 이 경우 필요한 것은 누적 합계뿐이고 집계의 전체 상태가 아니므로 sum과 함께 SimpleAggregateFunction 타입을 사용하는 것이 적합해요. 결과적으로 더 빠르고 부분 집계 상태의 병합도 필요하지 않아요. 먼저 원시 데이터를 위한 테이블을 만들어요:

Query

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,
  -- Initial value for sum state (1 if upvote, 0 otherwise)
  toUInt64(vote_type = 'upvote') AS upvotes,
  -- Initial value for sum state (1 if downvote, 0 otherwise)
  toUInt64(vote_type = 'downvote') AS downvotes,
  -- Initial value for sum state (1 for upvote, -1 for downvote)
  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 -- Query the target table
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 │
└─────────┴───────────────┴─────────────────┴─────────────┘

더 알아보기 (Learn more)