Saltar al contenido principal

Descripción

El combinador SimpleState puede aplicarse a la función sum para devolver la suma de todos los valores de entrada. Devuelve el resultado con el tipo SimpleAggregateFunction.

Ejemplo de uso

Seguimiento de votos positivos y negativos

Veamos un ejemplo práctico con una tabla que registra los votos de las publicaciones. Para cada publicación, queremos mantener totales acumulados de votos positivos, votos negativos y una puntuación global. El uso del tipo SimpleAggregateFunction con sum es adecuado para este caso, ya que solo necesitamos almacenar los totales acumulados, no el estado completo de la agregación. Como resultado, será más rápido y no requerirá la fusión de estados agregados parciales. Primero, creamos una tabla para los datos sin procesar:
Query
CREATE TABLE raw_votes
(
    post_id UInt32,
    vote_type Enum8('upvote' = 1, 'downvote' = -1)
)
ENGINE = MergeTree()
ORDER BY post_id;
A continuación, creamos la tabla de destino que almacenará los datos agregados:
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;
Luego, creamos una vista materializada con columnas de tipo SimpleAggregateFunction:
CREATE MATERIALIZED VIEW mv_vote_processor TO vote_aggregates
AS
SELECT
  post_id,
  -- Valor inicial para el estado de suma (1 si es upvote, 0 en caso contrario)
  toUInt64(vote_type = 'upvote') AS upvotes,
  -- Valor inicial para el estado de suma (1 si es downvote, 0 en caso contrario)
  toUInt64(vote_type = 'downvote') AS downvotes,
  -- Valor inicial para el estado de suma (1 para upvote, -1 para downvote)
  toInt64(vote_type) AS score
FROM raw_votes;
Insertar datos de ejemplo:
INSERT INTO raw_votes VALUES
    (1, 'upvote'),
    (1, 'upvote'),
    (1, 'downvote'),
    (2, 'upvote'),
    (2, 'downvote'),
    (3, 'downvote');
Consulta la vista materializada con el combinador SimpleState:
SELECT
  post_id,
  sum(upvotes) AS total_upvotes,
  sum(downvotes) AS total_downvotes,
  sum(score) AS total_score
FROM vote_aggregates -- Consultar la tabla de destino
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 │
└─────────┴───────────────┴─────────────────┴─────────────┘

Véase también

Última modificación el 10 de junio de 2026