Vertica to dbt Model Conversion
Purpose
Transform Vertica DDL (views, tables, stored procedures) into production-quality dbt models
compatible with Snowflake, maintaining the same business logic and data transformation steps while
following dbt best practices.
When to Use This Skill
Activate this skill when users ask about:
- Converting Vertica views or tables to dbt models
- Migrating Vertica stored procedures to dbt
- Translating Vertica SQL syntax to Snowflake
- Generating schema.yml files with tests and documentation
- Handling Vertica-specific syntax (projections, flex tables, ANY/ALL predicates)
Task Description
You are a database engineer working for a hospital system. You need to convert Vertica DDL to
equivalent dbt code compatible with Snowflake, maintaining the same business logic and data
transformation steps while following dbt best practices.
Input Requirements
I will provide you the Vertica DDL to convert.
Audience
The code will be executed by data engineers who are learning Snowflake and dbt.
Output Requirements
Generate the following:
- One or more dbt models with complete SQL for every column
- A corresponding schema.yml file with appropriate tests and documentation
- A config block with materialization strategy
- Explanation of key changes and architectural decisions
- Inline comments highlighting any syntax that was converted
Conversion Guidelines
General Principles
- Replace procedural logic with declarative SQL where possible
- Break down complex procedures into multiple modular dbt models
- Implement appropriate incremental processing strategies
- Maintain data quality checks through dbt tests
- Use Snowflake SQL functions rather than macros whenever possible
Sample Response Format
-- dbt model: models/[domain]/[target_schema_name]/model_name.sql
{{ config(materialized='view') }}
/* Original Object: [schema].[object_name]
Source Platform: Vertica
Purpose: [brief description]
Conversion Notes: [key changes]
Description: [SQL logic description] */
WITH source_data AS (
SELECT
customer_id::INTEGER AS customer_id,
customer_name::VARCHAR(100) AS customer_name,
account_balance::NUMBER(18,2) AS account_balance,
-- TIMESTAMPTZ converted to TIMESTAMP_TZ
created_date::TIMESTAMP_TZ AS created_date
FROM {{ ref('upstream_model') }}
),
transformed_data AS (
SELECT
customer_id,
UPPER(customer_name)::VARCHAR(100) AS customer_name_upper,
account_balance,
created_date,
CURRENT_TIMESTAMP()::TIMESTAMP_NTZ AS loaded_at
FROM source_data
)
SELECT
customer_id,
customer_name_upper,
account_balance,
created_date,
loaded_at
FROM transformed_data
## models/[domain]/[target_schema_name]/_models.yml
version: 2
models:
- name: model_name
description: "Table description; converted from Vertica [Original object name]"
columns:
- name: customer_id
description: "Primary key - unique customer identifier"
tests:
- unique
- not_null
- name: customer_name_upper
description: "Customer name in uppercase"
- name: account_balance
description: "Current account balance; Foreign key to OTHER_TABLE"
tests:
- relationships:
to: ref('OTHER_TABLE')
field: OTHER_TABLE_KEY
- name: created_date
description: "Date the customer record was created"
- name: loaded_at
description: "Timestamp when the record was loaded by dbt"
## dbt_project.yml (excerpt)
models:
my_project:
+materialized: view
domain_name:
+schema: target_schema_name
Specific Translation Rules
dbt Specific Requirements
- If the source is a view, use a view materialization in dbt
- Include appropriate dbt model configuration (materialization type)
- Add documentation blocks for a schema.yml
- Add descriptions for tables and columns
- Include relevant tests
- Define primary keys and relationships
- Assume that upstream objects are models
- Comprehensively provide all the columns in the output
- Break complex procedures into multiple models if needed
- Implement appropriate incremental strategies for large tables
- Use Snowflake SQL functions rather than macros whenever possible
- Always cast columns with explicit precision/scale using
::TYPE syntax (e.g.,
column_name::VARCHAR(100), amount::NUMBER(18,2)) to ensure output matches expected data types
- Always provide explicit column aliases for clarity and documentation
Performance Optimization
- Suggest clustering keys if needed
- Recommend materialization strategy (view vs table)
- Identify potential performance improvements
Vertica to Snowflake Syntax Conversion
- Remove projection specifications
- Handle flex table conversions
- Convert case sensitivity with quoted identifiers
- Replace ANY/ALL array predicates with Snowflake equivalents
- Convert Vertica-specific functions
- Handle COPY syntax differences
- Remove SEGMENTED BY clauses
Key Data Type Mappings
| Vertica |
Snowflake |
Notes |
| INT/INTEGER/BIGINT/SMALLINT/TINYINT |
Same |
|
| NUMERIC/DECIMAL |
Same |
|
| FLOAT/REAL/DOUBLE PRECISION |
FLOAT |
|
| CHAR/VARCHAR |
Same |
|
| LONG VARCHAR |
VARCHAR |
|
| BINARY/VARBINARY/LONG VARBINARY |
BINARY |
|
| BOOLEAN |
BOOLEAN |
|
| DATE |
DATE |
|
| TIME/TIMETZ |
TIME |
|
| TIMESTAMP/TIMESTAMPTZ |
TIMESTAMP/TIMESTAMP_TZ |
|
| INTERVAL |
VARCHAR |
|
| UUID |
VARCHAR |
|
Key Syntax Conversions
-- Projections -> Remove (Snowflake auto-manages)
CREATE PROJECTION proj AS SELECT ... -> (remove entirely)
-- SEGMENTED BY -> CLUSTER BY
CREATE TABLE t (...) SEGMENTED BY HASH(id) ->
CREATE TABLE t (...) CLUSTER BY (id)
-- Flex tables -> VARIANT columns
CREATE FLEX TABLE t() -> CREATE TABLE t (data VARIANT)
-- Case sensitivity (Vertica folds to lowercase)
SELECT Col -> SELECT "Col" -- if case matters
-- ANY/ALL array predicates
col = ANY(ARRAY[1,2,3]) -> col IN (1,2,3)
col <> ALL(ARRAY[1,2,3]) -> col NOT IN (1,2,3)
Common Function Mappings
| Vertica |
Snowflake |
Notes |
NVL(a, b) |
NVL(a, b) |
Same |
NVL2(a, b, c) |
IFF(a IS NOT NULL, b, c) |
|
COALESCE(...) |
COALESCE(...) |
Same |
NULLIF(a, b) |
NULLIF(a, b) |
Same |
DECODE(expr, ...) |
CASE expr WHEN ... END |
|
GETDATE() |
CURRENT_TIMESTAMP() |
|
SYSDATE |
CURRENT_TIMESTAMP() |
|
ADD_MONTHS(d, n) |
DATEADD('month', n, d) |
|
DATEDIFF(unit, d1, d2) |
DATEDIFF(unit, d1, d2) |
Same |
TO_CHAR(d, fmt) |
TO_CHAR(d, fmt) |
Same |
TO_DATE(s, fmt) |
TO_DATE(s, fmt) |
Same |
INSTR(str, search) |
POSITION(search IN str) |
|
SUBSTR(s, pos, len) |
SUBSTR(s, pos, len) |
Same |
REGEXP_LIKE(s, p) |
REGEXP_LIKE(s, p) |
Same |
LISTAGG(col, delim) |
LISTAGG(col, delim) |
Same |
SPLIT_PART(s, d, n) |
SPLIT_PART(s, d, n) |
Same |
Dependencies
- List any upstream dependencies
- Suggest model organization in dbt project
Validation Checklist
- [] Every DDL statement has been accounted for in the dbt models
- [] SQL in models is compatible with Snowflake
- [] Vertica-specific syntax converted (projections removed, case sensitivity handled)
- [] All business logic preserved
- [] All columns included in output
- [] Data types correctly mapped
- [] Functions translated to Snowflake equivalents
- [] Materialization strategy selected
- [] Tests added
- [] SQL logic description complete
- [] Table descriptions added
- [] Column descriptions added
- [] Dependencies correctly mapped
- [] Incremental logic (if applicable) verified
- [] Inline comments added for converted syntax
Related Skills
- $dbt-migration - For the complete migration workflow (discovery, planning, placeholder models,
testing, deployment)
- $dbt-modeling - For CTE patterns and SQL structure guidance
- $dbt-testing - For implementing comprehensive dbt tests
- $dbt-architecture - For project organization and folder structure
- $dbt-materializations - For choosing materialization strategies (view, table, incremental,
snapshots)
- $dbt-performance - For clustering keys, warehouse sizing, and query optimization
- $dbt-commands - For running dbt commands and model selection syntax
- $dbt-core - For dbt installation, configuration, and package management
- $snowflake-cli - For executing SQL and managing Snowflake objects
Supported Source Database
| Database |
Key Considerations |
| Vertica |
Projections, flex tables, case sensitivity with quotes, ANY/ALL array predicates |
Translation References
Detailed syntax translation guides are available in the translation-references/ folder.
Copyright Notice: The translation reference documentation in this repository is derived from
Snowflake SnowConvert Documentation
and is © Copyright Snowflake Inc. All rights reserved. Used for reference purposes only.
Reference Index
- Create Table
- Create View
- Data Types
- Identifier Between Vertica And Snowflake
- Operators
- Predicates
- Overview (README)
- Subqueries
Converted and distributed by TomeVault — claim your Tome and manage your conversions.
1---2name: dbt-migration-vertica3description: Transform Vertica DDL (views, tables, stored procedures) into production-quality dbt models Use when this capability is needed.4---56# Vertica to dbt Model Conversion78## Purpose910Transform Vertica DDL (views, tables, stored procedures) into production-quality dbt models11compatible with Snowflake, maintaining the same business logic and data transformation steps while12following dbt best practices.1314## When to Use This Skill1516Activate this skill when users ask about:1718- Converting Vertica views or tables to dbt models19- Migrating Vertica stored procedures to dbt20- Translating Vertica SQL syntax to Snowflake21- Generating schema.yml files with tests and documentation22- Handling Vertica-specific syntax (projections, flex tables, ANY/ALL predicates)2324---2526## Task Description2728You are a database engineer working for a hospital system. You need to convert Vertica DDL to29equivalent dbt code compatible with Snowflake, maintaining the same business logic and data30transformation steps while following dbt best practices.3132## Input Requirements3334I will provide you the Vertica DDL to convert.3536## Audience3738The code will be executed by data engineers who are learning Snowflake and dbt.3940## Output Requirements4142Generate the following:43441. One or more dbt models with complete SQL for every column452. A corresponding schema.yml file with appropriate tests and documentation463. A config block with materialization strategy474. Explanation of key changes and architectural decisions485. Inline comments highlighting any syntax that was converted4950## Conversion Guidelines5152### General Principles5354- Replace procedural logic with declarative SQL where possible55- Break down complex procedures into multiple modular dbt models56- Implement appropriate incremental processing strategies57- Maintain data quality checks through dbt tests58- Use Snowflake SQL functions rather than macros whenever possible5960### Sample Response Format6162```sql63-- dbt model: models/[domain]/[target_schema_name]/model_name.sql64{{ config(materialized='view') }}6566/* Original Object: [schema].[object_name]67 Source Platform: Vertica68 Purpose: [brief description]69 Conversion Notes: [key changes]70 Description: [SQL logic description] */7172WITH source_data AS (73 SELECT74 customer_id::INTEGER AS customer_id,75 customer_name::VARCHAR(100) AS customer_name,76 account_balance::NUMBER(18,2) AS account_balance,77 -- TIMESTAMPTZ converted to TIMESTAMP_TZ78 created_date::TIMESTAMP_TZ AS created_date79 FROM {{ ref('upstream_model') }}80),8182transformed_data AS (83 SELECT84 customer_id,85 UPPER(customer_name)::VARCHAR(100) AS customer_name_upper,86 account_balance,87 created_date,88 CURRENT_TIMESTAMP()::TIMESTAMP_NTZ AS loaded_at89 FROM source_data90)9192SELECT93 customer_id,94 customer_name_upper,95 account_balance,96 created_date,97 loaded_at98FROM transformed_data99```100101```yaml102## models/[domain]/[target_schema_name]/_models.yml103version: 2104105models:106 - name: model_name107 description: "Table description; converted from Vertica [Original object name]"108 columns:109 - name: customer_id110 description: "Primary key - unique customer identifier"111 tests:112 - unique113 - not_null114 - name: customer_name_upper115 description: "Customer name in uppercase"116 - name: account_balance117 description: "Current account balance; Foreign key to OTHER_TABLE"118 tests:119 - relationships:120 to: ref('OTHER_TABLE')121 field: OTHER_TABLE_KEY122 - name: created_date123 description: "Date the customer record was created"124 - name: loaded_at125 description: "Timestamp when the record was loaded by dbt"126```127128```yaml129## dbt_project.yml (excerpt)130models:131 my_project:132 +materialized: view133 domain_name:134 +schema: target_schema_name135```136137### Specific Translation Rules138139#### dbt Specific Requirements140141- If the source is a view, use a view materialization in dbt142- Include appropriate dbt model configuration (materialization type)143- Add documentation blocks for a schema.yml144- Add descriptions for tables and columns145- Include relevant tests146- Define primary keys and relationships147- Assume that upstream objects are models148- Comprehensively provide all the columns in the output149- Break complex procedures into multiple models if needed150- Implement appropriate incremental strategies for large tables151- Use Snowflake SQL functions rather than macros whenever possible152- **Always cast columns with explicit precision/scale** using `::TYPE` syntax (e.g.,153 `column_name::VARCHAR(100)`, `amount::NUMBER(18,2)`) to ensure output matches expected data types154- **Always provide explicit column aliases** for clarity and documentation155156#### Performance Optimization157158- Suggest clustering keys if needed159- Recommend materialization strategy (view vs table)160- Identify potential performance improvements161162#### Vertica to Snowflake Syntax Conversion163164- Remove projection specifications165- Handle flex table conversions166- Convert case sensitivity with quoted identifiers167- Replace ANY/ALL array predicates with Snowflake equivalents168- Convert Vertica-specific functions169- Handle COPY syntax differences170- Remove SEGMENTED BY clauses171172#### Key Data Type Mappings173174| Vertica | Snowflake | Notes |175| ----------------------------------- | ---------------------- | ----- |176| INT/INTEGER/BIGINT/SMALLINT/TINYINT | Same | |177| NUMERIC/DECIMAL | Same | |178| FLOAT/REAL/DOUBLE PRECISION | FLOAT | |179| CHAR/VARCHAR | Same | |180| LONG VARCHAR | VARCHAR | |181| BINARY/VARBINARY/LONG VARBINARY | BINARY | |182| BOOLEAN | BOOLEAN | |183| DATE | DATE | |184| TIME/TIMETZ | TIME | |185| TIMESTAMP/TIMESTAMPTZ | TIMESTAMP/TIMESTAMP_TZ | |186| INTERVAL | VARCHAR | |187| UUID | VARCHAR | |188189#### Key Syntax Conversions190191```sql192-- Projections -> Remove (Snowflake auto-manages)193CREATE PROJECTION proj AS SELECT ... -> (remove entirely)194195-- SEGMENTED BY -> CLUSTER BY196CREATE TABLE t (...) SEGMENTED BY HASH(id) ->197CREATE TABLE t (...) CLUSTER BY (id)198199-- Flex tables -> VARIANT columns200CREATE FLEX TABLE t() -> CREATE TABLE t (data VARIANT)201202-- Case sensitivity (Vertica folds to lowercase)203SELECT Col -> SELECT "Col" -- if case matters204205-- ANY/ALL array predicates206col = ANY(ARRAY[1,2,3]) -> col IN (1,2,3)207col <> ALL(ARRAY[1,2,3]) -> col NOT IN (1,2,3)208```209210#### Common Function Mappings211212| Vertica | Snowflake | Notes |213| ------------------------ | -------------------------- | ----- |214| `NVL(a, b)` | `NVL(a, b)` | Same |215| `NVL2(a, b, c)` | `IFF(a IS NOT NULL, b, c)` | |216| `COALESCE(...)` | `COALESCE(...)` | Same |217| `NULLIF(a, b)` | `NULLIF(a, b)` | Same |218| `DECODE(expr, ...)` | `CASE expr WHEN ... END` | |219| `GETDATE()` | `CURRENT_TIMESTAMP()` | |220| `SYSDATE` | `CURRENT_TIMESTAMP()` | |221| `ADD_MONTHS(d, n)` | `DATEADD('month', n, d)` | |222| `DATEDIFF(unit, d1, d2)` | `DATEDIFF(unit, d1, d2)` | Same |223| `TO_CHAR(d, fmt)` | `TO_CHAR(d, fmt)` | Same |224| `TO_DATE(s, fmt)` | `TO_DATE(s, fmt)` | Same |225| `INSTR(str, search)` | `POSITION(search IN str)` | |226| `SUBSTR(s, pos, len)` | `SUBSTR(s, pos, len)` | Same |227| `REGEXP_LIKE(s, p)` | `REGEXP_LIKE(s, p)` | Same |228| `LISTAGG(col, delim)` | `LISTAGG(col, delim)` | Same |229| `SPLIT_PART(s, d, n)` | `SPLIT_PART(s, d, n)` | Same |230231#### Dependencies232233- List any upstream dependencies234- Suggest model organization in dbt project235236---237238## Validation Checklist239240- [] Every DDL statement has been accounted for in the dbt models241- [] SQL in models is compatible with Snowflake242- [] Vertica-specific syntax converted (projections removed, case sensitivity handled)243- [] All business logic preserved244- [] All columns included in output245- [] Data types correctly mapped246- [] Functions translated to Snowflake equivalents247- [] Materialization strategy selected248- [] Tests added249- [] SQL logic description complete250- [] Table descriptions added251- [] Column descriptions added252- [] Dependencies correctly mapped253- [] Incremental logic (if applicable) verified254- [] Inline comments added for converted syntax255256---257258## Related Skills259260- $dbt-migration - For the complete migration workflow (discovery, planning, placeholder models,261 testing, deployment)262- $dbt-modeling - For CTE patterns and SQL structure guidance263- $dbt-testing - For implementing comprehensive dbt tests264- $dbt-architecture - For project organization and folder structure265- $dbt-materializations - For choosing materialization strategies (view, table, incremental,266 snapshots)267- $dbt-performance - For clustering keys, warehouse sizing, and query optimization268- $dbt-commands - For running dbt commands and model selection syntax269- $dbt-core - For dbt installation, configuration, and package management270- $snowflake-cli - For executing SQL and managing Snowflake objects271272---273274## Supported Source Database275276| Database | Key Considerations |277| ----------- | -------------------------------------------------------------------------------- |278| **Vertica** | Projections, flex tables, case sensitivity with quotes, ANY/ALL array predicates |279280## Translation References281282Detailed syntax translation guides are available in the `translation-references/` folder.283284> **Copyright Notice:** The translation reference documentation in this repository is derived from285> [Snowflake SnowConvert Documentation](https://docs.snowflake.com/en/migrations/snowconvert-docs)286> and is © Copyright Snowflake Inc. All rights reserved. Used for reference purposes only.287288### Reference Index289290- [Create Table](translation-references/vertica-create-table.md)291- [Create View](translation-references/vertica-create-view.md)292- [Data Types](translation-references/vertica-data-types.md)293- [Identifier Between Vertica And Snowflake](translation-references/vertica-identifier-between-vertica-and-snowflake.md)294- [Operators](translation-references/vertica-operators.md)295- [Predicates](translation-references/vertica-predicates.md)296- [Overview (README)](translation-references/vertica-readme.md)297- [Subqueries](translation-references/vertica-subqueries.md)298299---300> Converted and distributed by [TomeVault](https://tomevault.io/claim/sfc-gh-dflippo) — claim your Tome and manage your conversions.301<!-- tomevault:4.0:skill_md:2026-04-11 -->