> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> CoalescingMergeTree hereda del motor MergeTree. Su característica clave es la capacidad de almacenar automáticamente el último valor distinto de NULL de cada columna durante las fusiones de partes.

# Motor de tabla CoalescingMergeTree

<Info>
  **Disponible a partir de la versión 25.6**

  Este motor de tabla está disponible a partir de la versión 25.6, tanto en OSS como en Cloud.
</Info>

Este motor hereda de [MergeTree](/docs/es/reference/engines/table-engines/mergetree-family/mergetree). La principal diferencia está en cómo se fusionan las partes de datos: en las tablas `CoalescingMergeTree`, ClickHouse sustituye todas las filas con la misma clave primaria (o, más precisamente, la misma [clave de ordenación](/docs/es/reference/engines/table-engines/mergetree-family/mergetree)) por una sola fila que contiene, para cada columna, el valor distinto de `NULL` más reciente.

Esto permite realizar upserts a nivel de columna, lo que significa que puedes actualizar solo columnas concretas en lugar de filas completas.

`CoalescingMergeTree` está pensado para usarse con tipos Nullable en columnas que no forman parte de la clave. Si las columnas no son Nullable, el comportamiento es el mismo que con [ReplacingMergeTree](/docs/es/reference/engines/table-engines/mergetree-family/replacingmergetree).

<div id="creating-a-table">
  ## Crear una tabla
</div>

```sql theme={null}
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    ...
) ENGINE = CoalescingMergeTree([columns])
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]
```

Para obtener información sobre los parámetros de la solicitud, consulte la [descripción de la solicitud](/docs/es/reference/statements/create/table).

<div id="parameters-of-coalescingmergetree">
  ### Parámetros de CoalescingMergeTree
</div>

<div id="columns">
  #### Columnas
</div>

`columns` - Opcional. Una tupla con los nombres de las columnas cuyos valores se combinarán. Las columnas proporcionadas no deben formar parte de la partición ni de la clave de ordenación. Si no se especifica `columns`, ClickHouse combina los valores de todas las columnas que no forman parte de la clave de ordenación.

<div id="query-clauses">
  ### Cláusulas de consulta
</div>

Al crear una tabla `CoalescingMergeTree`, se requieren las mismas [cláusulas](/docs/es/reference/engines/table-engines/mergetree-family/mergetree) que al crear una tabla `MergeTree`.

<details markdown="1">
  <summary>Método obsoleto para crear una tabla</summary>

  <Note>
    No utilice este método en proyectos nuevos y, si es posible, migre los proyectos antiguos al método descrito anteriormente.
  </Note>

  ```sql theme={null}
  CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
  (
      name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
      name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
      ...
  ) ENGINE [=] CoalescingMergeTree(date-column [, sampling_expression], (primary, key), index_granularity, [columns])
  ```

  Todos los parámetros, excepto `columns`, tienen el mismo significado que en `MergeTree`.

  * `columns` — tupla con los nombres de las columnas cuyos valores se sumarán. Parámetro opcional. Para más información, consulte el texto anterior.
</details>

<div id="usage-example">
  ## Ejemplo de uso
</div>

Considere la siguiente tabla:

```sql theme={null}
CREATE TABLE test_table
(
    key UInt64,
    value_int Nullable(UInt32),
    value_string Nullable(String),
    value_date Nullable(Date)
)
ENGINE = CoalescingMergeTree()
ORDER BY key
```

Inserta datos en ella:

```sql theme={null}
INSERT INTO test_table VALUES(1, NULL, NULL, '2025-01-01'), (2, 10, 'test', NULL);
INSERT INTO test_table VALUES(1, 42, 'win', '2025-02-01');
INSERT INTO test_table(key, value_date) VALUES(2, '2025-02-01');
```

El resultado será así:

```sql theme={null}
SELECT * FROM test_table ORDER BY key;
```

```text theme={null}
┌─key─┬─value_int─┬─value_string─┬─value_date─┐
│   1 │        42 │ win          │ 2025-02-01 │
│   1 │      ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ         │ 2025-01-01 │
│   2 │      ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ         │ 2025-02-01 │
│   2 │        10 │ test         │       ᴺᵁᴸᴸ │
└─────┴───────────┴──────────────┴────────────┘
```

Consulta recomendada para obtener el resultado correcto y definitivo:

```sql theme={null}
SELECT * FROM test_table FINAL ORDER BY key;
```

```text theme={null}
┌─key─┬─value_int─┬─value_string─┬─value_date─┐
│   1 │        42 │ win          │ 2025-02-01 │
│   2 │        10 │ test         │ 2025-02-01 │
└─────┴───────────┴──────────────┴────────────┘
```

Usar el modificador `FINAL` obliga a ClickHouse a aplicar la lógica de fusión en tiempo de consulta, lo que garantiza que obtengas el valor "más reciente" correcto y consolidado para cada columna. Este es el método más seguro y preciso al consultar una tabla CoalescingMergeTree.

<Note>
  Un enfoque con `GROUP BY` puede devolver resultados incorrectos si las partes subyacentes no se han fusionado por completo.

  ```sql theme={null}
  SELECT key, last_value(value_int), last_value(value_string), last_value(value_date)  FROM test_table GROUP BY key; -- No recomendado.
  ```
</Note>

<div id="tuple-element-aggregation">
  ## Agregación de elementos de Tuple
</div>

Cuando la configuración `allow_tuple_element_aggregation` está habilitada, las columnas `Tuple` se aplanan de forma recursiva para que cada elemento hoja participe en la coalescencia de manera independiente. Esto permite almacenar varios campos en una sola columna `Tuple` y que se coaleszcan por elemento durante las fusiones; cada subcolumna `Nullable` conserva de manera independiente el valor distinto de `NULL` más reciente.

A las subcolumnas aplanadas se les aplican las mismas reglas que a las columnas normales:

* Las subcolumnas que pertenecen a un `Tuple` de la clave de ordenación o de la clave de partición se excluyen de la coalescencia.
* Si se especifica `columns`, solo se coalescen las subcolumnas de las columnas `Tuple` incluidas en la lista.

<Note>
  Esta configuración es inmutable y debe especificarse al crear la tabla.
</Note>

```sql theme={null}
CREATE TABLE coalescing_tuples
(
    key UInt64,
    data Tuple(
        value_a Nullable(UInt64),
        value_b Nullable(String),
        nested Tuple(
            value_c Nullable(UInt64)
        )
    )
) ENGINE = CoalescingMergeTree()
ORDER BY key
SETTINGS allow_tuple_element_aggregation = 1;

INSERT INTO coalescing_tuples VALUES (1, (100, NULL, (NULL)));
INSERT INTO coalescing_tuples VALUES (1, (NULL, 'hello', (42)));

SELECT key, data.value_a, data.value_b, data.nested.value_c FROM coalescing_tuples FINAL;
```

```text theme={null}
┌─key─┬─data.value_a─┬─data.value_b─┬─data.nested.value_c─┐
│   1 │          100 │ hello        │                  42 │
└─────┴──────────────┴──────────────┴─────────────────────┘
```
