Edilitics | Data to Decisions

Concat

Concatenate tables vertically, horizontally, or diagonally. Schema compatibility is checked automatically with built-in duplicate handling. No code needed.

Concat merges the current dataset with a table from any connected integration. Three modes: Vertical stacks rows (union), Horizontal aligns columns side by side, Diagonal merges square matrices. Schema compatibility is checked automatically when you select a table. Duplicate handling is configurable before saving.

The source table can come from a different database or integration than the current pipeline source. No need to land both datasets in a shared warehouse first.


When to Use Concat

  • Stack regional tables. Vertical concat orders_na and orders_eu into a single orders dataset for global reporting.
  • Combine attribute tables. Horizontal concat a transaction table with a metadata table that has the same row count.
  • Append new data. Vertical concat last month's orders into the current dataset to extend the time range.
  • Merge after sampling. Concat a sampled subset back to a reference dataset for comparison.

Sample Dataset

The examples in this doc use three sample datasets. Download all three to follow along in your own workspace.

edilitics_sample_orders.csv

Primary orders dataset (H1) - use as the current pipeline source for vertical concat · 500 rows

Download

edilitics_sample_orders_h2.csv

Orders dataset (H2) - use as the second table for vertical concat · 250 rows

Download

edilitics_sample_products.csv

Product catalog - use as the second table for horizontal concat on product_id · 4 rows

Download

Concat Types

TypeWhat it doesRequirement
VerticalStacks rows from the selected table below the current dataset. Column names and types must match (or mismatches resolved by dropping columns).Compatible column schema
HorizontalAppends columns from the selected table alongside the current dataset. Row counts must match. Common columns must be resolved by dropping from left or right.Same row count, no column overlap
DiagonalMerges both rows and columns for square-matrix-style integration.Equal row count, column count, and types

How to Apply Concat

Open the Concat operation

In your Transform pipeline, click Add Operation and select Concat from the operation list.

Select a concat type

In the type dropdown, choose one of:

  • Vertical - Stack rows from datasets with matching columns.
  • Horizontal - Join datasets with matching row counts by aligning columns side by side.
  • Diagonal - Merge square matrices using diagonal alignment.

The four-column header row updates for the selected type.

Select the Database

In the Database dropdown, select any connected integration. This can be the same integration as the current source or a different one.

Select the Table Name

In the Table Name dropdown, select the table to merge. Tables already in use by previous Concat or Join operations in this pipeline are excluded.

Selecting a table triggers an automatic compatibility check. The Drop Columns field updates to show the result.

Review the compatibility check

The Drop Columns field shows one of:

  • "Concatenation possible" (green) - Schema is compatible. Proceed to Save & Preview.
  • "Concatenation not allowed" (red) - Schema conflicts exist. Click the field to open the conflict resolution modal.

Resolve conflicts before saving. See the conflict resolution section below for each concat type.

Select Manage Duplicates

Choose how to handle duplicate rows after merging:

  • Keep All - Keep all rows including duplicates.
  • Keep First - Keep the first occurrence of each duplicate.
  • Keep Last - Keep the last occurrence of each duplicate.
  • Drop All - Remove all rows that appear more than once.

Click Save & Preview

Save & Preview is enabled only when the compatibility check shows "Concatenation possible". Click it to merge the datasets. The success toast confirms: "Datasets merged. Preview updated with the concatenated output."


Conflict Resolution

Vertical conflicts

When a vertical concat check finds mismatches, a modal opens showing:

IssueEffectResolution
Extra ColumnsColumns in the source table not in the target table.Click Drop Columns in the modal to exclude them and allow the concat.
Columns Not FoundColumns in the current dataset not found in the source table.Click Drop Columns to exclude them and allow the concat.
Columns Datatypes Do Not MatchSame column name but different type in both tables.Cannot be resolved by dropping. Fix the data type mismatch in the source before retrying. The concat is blocked.

Data type mismatches in vertical concat cannot be resolved within the operation. Cast the column to a matching type in the source dataset or the current pipeline before retrying the concat.

Horizontal conflicts

When a horizontal concat check finds common column names in both tables, a modal opens listing the shared columns. You must choose:

  • Drop Columns From Left Table - Remove shared columns from the current dataset before merging.
  • Drop Columns From Right Table - Remove shared columns from the source table before merging.

Select a side and click Drop Columns to allow the concat.


Before and After

Vertical concat

Concat edilitics_sample_orders (500 rows, 13 columns) with edilitics_sample_orders_h2 (250 rows, 15 columns) on Vertical. H2 has two extra columns (return_flag, delivery_partner) not present in H1 - the compatibility check returns "Concatenation not allowed" (red). Click to open the conflict resolution modal, then click Drop Columns to exclude return_flag and delivery_partner from the source table. Manage Duplicates: Keep All.

Input (current dataset): 500 rows, 13 columns (order_id, customer_name, email, sales_rep, region, product_id, order_date, delivery_date, revenue, units_sold, discount_pct, product_tier, metadata, notes)

Second table: 250 rows, 15 columns (same 13 + return_flag, delivery_partner)

After dropping extra columns from source: 250 rows, 13 columns aligned

Output: 750 rows, 13 columns


Horizontal concat

Concat edilitics_sample_orders (500 rows, 13 columns) with edilitics_sample_products (4 rows, 7 columns) is not valid as a horizontal concat - row counts do not match (500 vs 4). Horizontal concat requires identical row counts. Use Join on product_id to enrich orders with product columns instead.

For a valid horizontal concat example: split edilitics_sample_orders into two derived tables of 500 rows each with no shared column names, then horizontal concat to produce 500 rows with the combined column set.


Code Equivalent

-- Vertical concat (PostgreSQL / BigQuery / Snowflake / DuckDB)
SELECT * FROM orders_q1
UNION ALL
SELECT * FROM orders_q2;

-- Vertical concat with deduplication (keep first)
SELECT DISTINCT ON (order_id) *
FROM (
  SELECT * FROM orders_q1
  UNION ALL
  SELECT * FROM orders_q2
) combined
ORDER BY order_id;

-- Horizontal concat (same row count, no shared columns)
SELECT a.*, b.source, b.channel
FROM orders a
JOIN metadata_table b ON a.rn = b.rn;
import polars as pl

# Vertical concat
df_combined = pl.concat([df_q1, df_q2], how="vertical")

# Vertical concat, keep only common columns
common_cols = [c for c in df_q1.columns if c in df_q2.columns]
df_combined = pl.concat(
    [df_q1.select(common_cols), df_q2.select(common_cols)],
    how="vertical"
)

# Deduplicate after concat
df_combined = df_combined.unique(keep="first")

# Horizontal concat
df_wide = pl.concat([df_orders, df_metadata], how="horizontal")

# Diagonal concat
df_diag = pl.concat([df_a, df_b], how="diagonal")

After Save & Preview, the pipeline shows a DQ delta badge on this step - green if the table score improved, red if it dropped. See Data Quality Scoring for how scores are calculated.


After Save & Preview, the pipeline shows a DQ delta badge on this step - green if the table score improved, red if it dropped. See Data Quality Scoring for how scores are calculated.


Operation Reference

Prop

Type


Frequently Asked Questions


Next Steps

Need help? Email support@edilitics.com with your workspace, job ID, and context. We reply within one business day.

Last updated on

On this page