Write correct, performant SQL across all major data warehouse dialects (Snowflake, BigQuery, Databricks, PostgreSQL, etc.). Use when writing queries, optimizing slow SQL, translating between dialects, or building complex analytical queries with CTEs, window functions, or aggregations.
Write correct, performant SQL across all major data warehouse dialects (Snowflake, BigQuery, Databricks, PostgreSQL, etc.). Use when writing queries, optimizing slow SQL, translating between dialects, or building complex analytical queries with CTEs, window functions, or aggregations.
SQL Queries Skill
Write correct, performant, readable SQL across all major data warehouse dialects.
Design distribution keys for collocated joins (DISTKEY)
Use sort keys for frequently filtered columns (SORTKEY)
Use EXPLAIN to check query plan
Avoid cross-node data movement (watch for DS_BCAST and DS_DIST)
ANALYZE and VACUUM regularly
Use late-binding views for schema flexibility
Databricks SQL
Date/time:
-- Current date/timeCURRENT_DATE(), CURRENT_TIMESTAMP()
-- Date arithmetic
DATE_ADD(date_column, 7)
DATEDIFF(end_date, start_date)
ADD_MONTHS(date_column, 1)
-- Truncate to period
DATE_TRUNC('MONTH', created_at)
TRUNC(date_column, 'MM')
-- Extract partsYEAR(created_at), MONTH(created_at)
DAYOFWEEK(created_at)
Delta Lake features:
-- Time travelSELECT*FROM my_table TIMESTAMPASOF'2024-01-15'SELECT*FROM my_table VERSION ASOF42-- Describe historyDESCRIBE HISTORY my_table
-- Merge (upsert)MERGEINTO target USING source
ON target.id = source.id
WHEN MATCHED THENUPDATESET*WHENNOT MATCHED THENINSERT*
Performance tips:
Use Delta Lake's OPTIMIZE and ZORDER for query performance
Leverage Photon engine for compute-intensive queries
Use CACHE TABLE for frequently accessed datasets
Partition by low-cardinality date columns
Common SQL Patterns
Window Functions
-- RankingROW_NUMBER() OVER (PARTITIONBY user_id ORDERBY created_at DESC)
RANK() OVER (PARTITIONBY category ORDERBY revenue DESC)
DENSE_RANK() OVER (ORDERBY score DESC)
-- Running totals / moving averagesSUM(revenue) OVER (ORDERBY date_col ROWSBETWEEN UNBOUNDED PRECEDING ANDCURRENTROW) as running_total
AVG(revenue) OVER (ORDERBY date_col ROWSBETWEEN6 PRECEDING ANDCURRENTROW) as moving_avg_7d
-- Lag / LeadLAG(value, 1) OVER (PARTITIONBY entity ORDERBY date_col) as prev_value
LEAD(value, 1) OVER (PARTITIONBY entity ORDERBY date_col) as next_value
-- First / Last valueFIRST_VALUE(status) OVER (PARTITIONBY user_id ORDERBY created_at ROWSBETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
LAST_VALUE(status) OVER (PARTITIONBY user_id ORDERBY created_at ROWSBETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
-- Percent of total
revenue /SUM(revenue) OVER () as pct_of_total
revenue /SUM(revenue) OVER (PARTITIONBY category) as pct_of_category
CTEs for Readability
WITH-- Step 1: Define the base population
base_users AS (
SELECT user_id, created_at, plan_type
FROM users
WHERE created_at >=DATE'2024-01-01'AND status ='active'
),
-- Step 2: Calculate user-level metrics
user_metrics AS (
SELECT
u.user_id,
u.plan_type,
COUNT(DISTINCT e.session_id) as session_count,
SUM(e.revenue) as total_revenue
FROM base_users u
LEFTJOIN events e ON u.user_id = e.user_id
GROUPBY u.user_id, u.plan_type
),
-- Step 3: Aggregate to summary level
summary AS (
SELECT
plan_type,
COUNT(*) as user_count,
AVG(session_count) as avg_sessions,
SUM(total_revenue) as total_revenue
FROM user_metrics
GROUPBY plan_type
)
SELECT*FROM summary ORDERBY total_revenue DESC;
Cohort Retention
WITH cohorts AS (
SELECT
user_id,
DATE_TRUNC('month', first_activity_date) as cohort_month
FROM users
),
activity AS (
SELECT
user_id,
DATE_TRUNC('month', activity_date) as activity_month
FROM user_activity
)
SELECT
c.cohort_month,
COUNT(DISTINCT c.user_id) as cohort_size,
COUNT(DISTINCTCASEWHEN a.activity_month = c.cohort_month THEN a.user_id
END) as month_0,
COUNT(DISTINCTCASEWHEN a.activity_month = c.cohort_month +INTERVAL'1 month'THEN a.user_id
END) as month_1,
COUNT(DISTINCTCASEWHEN a.activity_month = c.cohort_month +INTERVAL'3 months'THEN a.user_id
END) as month_3
FROM cohorts c
LEFTJOIN activity a ON c.user_id = a.user_id
GROUPBY c.cohort_month
ORDERBY c.cohort_month;
Funnel Analysis
WITH funnel AS (
SELECT
user_id,
MAX(CASEWHEN event ='page_view'THEN1ELSE0END) as step_1_view,
MAX(CASEWHEN event ='signup_start'THEN1ELSE0END) as step_2_start,
MAX(CASEWHEN event ='signup_complete'THEN1ELSE0END) as step_3_complete,
MAX(CASEWHEN event ='first_purchase'THEN1ELSE0END) as step_4_purchase
FROM events
WHERE event_date >=CURRENT_DATE-INTERVAL'30 days'GROUPBY user_id
)
SELECTCOUNT(*) as total_users,
SUM(step_1_view) as viewed,
SUM(step_2_start) as started_signup,
SUM(step_3_complete) as completed_signup,
SUM(step_4_purchase) as purchased,
ROUND(100.0*SUM(step_2_start) /NULLIF(SUM(step_1_view), 0), 1) as view_to_start_pct,
ROUND(100.0*SUM(step_3_complete) /NULLIF(SUM(step_2_start), 0), 1) as start_to_complete_pct,
ROUND(100.0*SUM(step_4_purchase) /NULLIF(SUM(step_3_complete), 0), 1) as complete_to_purchase_pct
FROM funnel;
Deduplication
-- Keep the most recent record per keyWITH ranked AS (
SELECT*,
ROW_NUMBER() OVER (
PARTITIONBY entity_id
ORDERBY updated_at DESC
) as rn
FROM source_table
)
SELECT*FROM ranked WHERE rn =1;
Error Handling and Debugging
When a query fails:
Syntax errors: Check for dialect-specific syntax (e.g., ILIKE not available in BigQuery, SAFE_DIVIDE only in BigQuery)
Column not found: Verify column names against schema -- check for typos, case sensitivity (PostgreSQL is case-sensitive for quoted identifiers)
Type mismatches: Cast explicitly when comparing different types (CAST(col AS DATE), col::DATE)
Division by zero: Use NULLIF(denominator, 0) or dialect-specific safe division
Ambiguous columns: Always qualify column names with table alias in JOINs
Group by errors: All non-aggregated columns must be in GROUP BY (except in BigQuery which allows grouping by alias)