Cheat sheet, 5 min read, updated 30 September 2026

Snowflake SQL cheat sheet

Snowflake-specific commands and syntax, on one printable page.

SnowflakeSQL
All cheat sheets and guides
All guides and cheat sheets

Context

SQL
USE ROLE analyst;
USE WAREHOUSE transform_wh;
USE DATABASE analytics;
USE SCHEMA marts;
SELECT CURRENT_ROLE(), CURRENT_WAREHOUSE();

Warehouses

SQL
CREATE WAREHOUSE bi_wh
  WAREHOUSE_SIZE = 'XSMALL'
  AUTO_SUSPEND = 60 AUTO_RESUME = TRUE;
ALTER WAREHOUSE bi_wh SET WAREHOUSE_SIZE = 'SMALL';
ALTER WAREHOUSE bi_wh SUSPEND;

Stages and loading

SQL
CREATE STAGE raw_stage
  FILE_FORMAT = (TYPE = CSV SKIP_HEADER = 1);
LIST @raw_stage;
COPY INTO raw.orders FROM @raw_stage
  PATTERN = '.*orders.*[.]csv'
  ON_ERROR = 'CONTINUE';

Unload to files

SQL
COPY INTO @raw_stage/export/sales_
FROM (SELECT * FROM marts.fct_sales)
FILE_FORMAT = (TYPE = PARQUET)
HEADER = TRUE;

JSON with VARIANT

SQL
SELECT v:id::NUMBER             AS id,
       v:customer.name::STRING  AS name,
       i.value:sku::STRING      AS sku
FROM raw.events,
     LATERAL FLATTEN(input => v:items) i;
PARSE_JSON('{"a": 1}')

QUALIFY

Filter on a window function directly.

SQL
SELECT *
FROM orders
QUALIFY ROW_NUMBER() OVER (
  PARTITION BY customer_id
  ORDER BY order_date DESC) = 1;

Handy functions

SQL
IFF(amount > 100, 'big', 'small')
DATEADD(month, -1, CURRENT_DATE)
DATEDIFF('day', start_date, end_date)
DATE_TRUNC('week', order_date)
TRY_TO_NUMBER('12a')     -- NULL, not an error
SPLIT_PART('a-b-c', '-', 2)   -- 'b'

Time travel

SQL
SELECT * FROM t AT(OFFSET => -60*60);  -- 1 hour ago
SELECT * FROM t AT(TIMESTAMP =>
  '2026-09-29 09:00'::TIMESTAMP_LTZ);
SELECT * FROM t BEFORE(STATEMENT => '<query_id>');
UNDROP TABLE t;

Zero-copy clone

SQL
CREATE DATABASE analytics_dev CLONE analytics;
CREATE TABLE t_backup CLONE t;
CREATE TABLE t_yday CLONE t
  AT(OFFSET => -60*60*24);

Streams and tasks

SQL
CREATE STREAM orders_s ON TABLE raw.orders;
CREATE TASK nightly WAREHOUSE = transform_wh
  SCHEDULE = 'USING CRON 0 2 * * * Europe/London'
AS CALL refresh_marts();
ALTER TASK nightly RESUME;

Roles and grants

SQL
CREATE ROLE analyst;
GRANT USAGE ON WAREHOUSE bi_wh TO ROLE analyst;
GRANT USAGE ON DATABASE analytics TO ROLE analyst;
GRANT USAGE ON SCHEMA analytics.marts TO ROLE analyst;
GRANT SELECT ON ALL TABLES IN SCHEMA analytics.marts
  TO ROLE analyst;
GRANT ROLE analyst TO USER maria;

Cost check

SQL
SELECT warehouse_name,
       SUM(credits_used) AS credits
FROM snowflake.account_usage.warehouse_metering_history
WHERE start_time >= DATEADD(day, -30, CURRENT_TIMESTAMP())
GROUP BY 1 ORDER BY 2 DESC;

Written by Alessandro Ecclesie Agazzi, freelance analytics engineer in London. Updated 30 September 2026.