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_naandorders_euinto 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
edilitics_sample_orders_h2.csv
Orders dataset (H2) - use as the second table for vertical concat · 250 rows
edilitics_sample_products.csv
Product catalog - use as the second table for horizontal concat on product_id · 4 rows
Concat Types
| Type | What it does | Requirement |
|---|---|---|
| Vertical | Stacks rows from the selected table below the current dataset. Column names and types must match (or mismatches resolved by dropping columns). | Compatible column schema |
| Horizontal | Appends 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 |
| Diagonal | Merges 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:
| Issue | Effect | Resolution |
|---|---|---|
| Extra Columns | Columns in the source table not in the target table. | Click Drop Columns in the modal to exclude them and allow the concat. |
| Columns Not Found | Columns in the current dataset not found in the source table. | Click Drop Columns to exclude them and allow the concat. |
| Columns Datatypes Do Not Match | Same 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
Drop / Rename Columns
Clean up column names or remove extra columns after merging.
Filter
Filter the merged dataset to keep only relevant rows.
Manage Nulls
Handle nulls introduced from diagonal concat or schema mismatches.
Join
Merge two tables using a key column match instead of positional alignment.
Need help? Email support@edilitics.com with your workspace, job ID, and context. We reply within one business day.
Last updated on
Joins
Merge two tables using a matching key column. Left, Right, Inner, and Outer joins supported. Join across any connected database. No code needed.
Filter
Keep rows that match conditions and remove the rest. Filter numeric columns by range, strings by value, and datetimes by time. Combine with AND logic.