What if you could write complex queries step-by-step without repeating yourself or getting lost in messy code?
Why Common Table Expressions (CTEs) in Snowflake? - Purpose & Use Cases
Start learning this pattern below
Jump into concepts and practice - no test required
Imagine you need to analyze sales data by first filtering recent orders, then calculating totals, and finally joining with customer info. Doing this step-by-step means writing long, repeated queries that are hard to read and fix.
Manually repeating the same subqueries makes your SQL messy and slow to update. If you make a mistake, you must fix it in many places. It's like copying the same recipe multiple times and risking typos everywhere.
Common Table Expressions let you name and save intermediate query results. You write each step once, then build on it clearly. This makes your SQL easier to read, maintain, and debug--like organizing your recipe into clear, reusable parts.
SELECT * FROM (SELECT * FROM orders WHERE date > '2024-01-01') o JOIN customers c ON o.customer_id = c.idWITH recent_orders AS (SELECT * FROM orders WHERE date > '2024-01-01') SELECT * FROM recent_orders o JOIN customers c ON o.customer_id = c.idCTEs unlock clear, stepwise query building that saves time and reduces errors in complex data tasks.
A data analyst quickly finds monthly sales trends by defining filtered sales data once, then reusing it to calculate totals and join with product info--all in one clean query.
CTEs let you break complex queries into named, reusable parts.
This makes SQL easier to read, write, and fix.
They help avoid repeating code and reduce mistakes.
Practice
WITH clause in Snowflake SQL?Solution
Step 1: Understand the role of the WITH clause
The WITH clause defines a Common Table Expression (CTE), which is a temporary named result set used within a query.Step 2: Differentiate from other SQL features
Unlike permanent tables or functions, CTEs exist only during query execution and help organize complex queries.Final Answer:
To define a temporary named result set for use in a query -> Option DQuick Check:
WITH clause = temporary named result set [OK]
- Thinking WITH creates permanent tables
- Confusing WITH with functions or variables
- Assuming WITH changes session settings
Solution
Step 1: Recall the standard CTE syntax
In Snowflake, a CTE starts with the keyword WITH followed by the CTE name and AS, then the query in parentheses.Step 2: Compare options to syntax
WITH cte_name AS (SELECT * FROM table) matches this pattern exactly: WITH cte_name AS (SELECT * FROM table)Final Answer:
WITH cte_name AS (SELECT * FROM table) -> Option CQuick Check:
CTE syntax starts with WITH [OK]
- Using CREATE instead of WITH
- Omitting AS keyword
- Using BEGIN or DEFINE which are invalid here
WITH cte AS (SELECT 1 AS num UNION ALL SELECT 2) SELECT SUM(num) FROM cte;
What is the output of this query?
Solution
Step 1: Understand the CTE content
The CTE named 'cte' selects two rows with values 1 and 2 under the column 'num'.Step 2: Calculate the SUM of 'num'
The main query sums the values 1 and 2, resulting in 3.Final Answer:
3 -> Option AQuick Check:
1 + 2 = 3 [OK]
- Thinking UNION ALL removes duplicates
- Confusing SUM with COUNT
- Expecting syntax error due to CTE
WITH cte AS SELECT * FROM employees SELECT * FROM cte;
Solution
Step 1: Review CTE syntax requirements
A CTE query must be enclosed in parentheses after the AS keyword.Step 2: Check the given query
The query lacks parentheses around the SELECT statement in the CTE definition.Final Answer:
Missing parentheses around the CTE query -> Option AQuick Check:
CTE query must be in parentheses [OK]
- Omitting parentheses around CTE query
- Thinking CTE names are restricted
- Believing CTEs can't be reused in same query
dept_salaries that selects employee salaries and departments. Which query correctly uses the CTE to get the average salary per department?Solution
Step 1: Verify correct CTE syntax and usage
WITH dept_salaries AS (SELECT department, salary FROM employees) SELECT department, AVG(salary) FROM dept_salaries GROUP BY department; correctly defines the CTE with parentheses and AS, then uses it to select department and average salary grouped by department.Step 2: Check aggregation and grouping
WITH dept_salaries AS (SELECT department, salary FROM employees) SELECT department, AVG(salary) FROM dept_salaries GROUP BY department; groups by department and calculates AVG(salary) from the CTE, which is the intended calculation.Final Answer:
WITH dept_salaries AS (SELECT department, salary FROM employees) SELECT department, AVG(salary) FROM dept_salaries GROUP BY department; -> Option BQuick Check:
CTE with correct syntax and grouping = WITH dept_salaries AS (SELECT department, salary FROM employees) SELECT department, AVG(salary) FROM dept_salaries GROUP BY department; [OK]
- Omitting parentheses in CTE definition
- Not grouping by department when aggregating
- Using employees table instead of CTE in main query
