Bird
Raised Fist0
Snowflakecloud~10 mins

Window functions in Snowflake - Interactive Code Practice

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to calculate the running total of sales using a window function.

Snowflake
SELECT sales, SUM(sales) OVER (ORDER BY [1]) AS running_total FROM sales_data;
Drag options to blanks, or click blank then click option'
Acustomer_id
Bsales
Cdate
Dregion
Attempts:
3 left
💡 Hint
Common Mistakes
Ordering by sales value instead of date.
Using a non-time related column for ordering.
2fill in blank
medium

Complete the code to assign a rank to each employee based on their salary within their department.

Snowflake
SELECT employee_id, department, salary, RANK() OVER (PARTITION BY [1] ORDER BY salary DESC) AS salary_rank FROM employees;
Drag options to blanks, or click blank then click option'
Aregion
Bemployee_id
Csalary
Ddepartment
Attempts:
3 left
💡 Hint
Common Mistakes
Partitioning by salary or employee_id instead of department.
Not partitioning at all, which ranks across all employees.
3fill in blank
hard

Fix the error in the code to calculate the moving average of sales over the last 3 days.

Snowflake
SELECT date, sales, AVG(sales) OVER (ORDER BY date ROWS BETWEEN [1] PRECEDING AND CURRENT ROW) AS moving_avg FROM sales_data;
Drag options to blanks, or click blank then click option'
A2
B1
C5
D7
Attempts:
3 left
💡 Hint
Common Mistakes
Using 1 preceding row which calculates a 2-day average.
Using 5 or 7 preceding rows which includes too many days.
4fill in blank
hard

Fill both blanks to calculate the difference between each sale and the previous sale within each region.

Snowflake
SELECT region, sales, sales - LAG([1]) OVER (PARTITION BY [2] ORDER BY date) AS sales_diff FROM sales_data;
Drag options to blanks, or click blank then click option'
Asales
Bdate
Cregion
Dcustomer_id
Attempts:
3 left
💡 Hint
Common Mistakes
Using date or customer_id in LAG instead of sales.
Partitioning by date or customer_id instead of region.
5fill in blank
hard

Fill all three blanks to calculate the cumulative sum of sales per product category ordered by date.

Snowflake
SELECT category, date, sales, SUM([1]) OVER (PARTITION BY [2] ORDER BY [3] ROWS UNBOUNDED PRECEDING) AS cumulative_sales FROM sales_data;
Drag options to blanks, or click blank then click option'
Asales
Bcategory
Cdate
Dregion
Attempts:
3 left
💡 Hint
Common Mistakes
Summing category or date instead of sales.
Partitioning by region instead of category.
Ordering by sales instead of date.

Practice

(1/5)
1. What does a window function in Snowflake do?
easy
A. Calculates values across rows related to the current row without grouping them into fewer rows
B. Groups rows and reduces the number of rows returned
C. Deletes duplicate rows from the result set
D. Creates a new table from existing data

Solution

  1. Step 1: Understand window function purpose

    Window functions perform calculations across a set of rows related to the current row but do not reduce the number of rows returned.
  2. Step 2: Compare with grouping

    Unlike GROUP BY, window functions keep all rows visible while calculating values like running totals or ranks.
  3. Final Answer:

    Calculates values across rows related to the current row without grouping them into fewer rows -> Option A
  4. Quick Check:

    Window functions analyze rows without grouping = A [OK]
Hint: Window functions keep all rows, unlike GROUP BY [OK]
Common Mistakes:
  • Confusing window functions with GROUP BY aggregation
  • Thinking window functions reduce row count
  • Assuming window functions delete duplicates
2. Which of the following is the correct syntax to calculate a running total of sales using a window function in Snowflake?
easy
A. SELECT SUM(sales) GROUP BY region ORDER BY date FROM sales_data;
B. SELECT sales + PREVIOUS(sales) FROM sales_data;
C. SELECT RUNNING_TOTAL(sales) FROM sales_data;
D. SELECT SUM(sales) OVER (PARTITION BY region ORDER BY date) FROM sales_data;

Solution

  1. Step 1: Identify correct window function syntax

    SUM(sales) OVER (PARTITION BY region ORDER BY date) correctly calculates a running total partitioned by region and ordered by date.
  2. Step 2: Eliminate incorrect options

    SELECT SUM(sales) GROUP BY region ORDER BY date FROM sales_data; uses GROUP BY which reduces rows, not a window function. Options C and D use invalid functions or syntax.
  3. Final Answer:

    SELECT SUM(sales) OVER (PARTITION BY region ORDER BY date) FROM sales_data; -> Option D
  4. Quick Check:

    SUM() OVER with PARTITION BY and ORDER BY = B [OK]
Hint: Look for SUM() OVER with PARTITION BY and ORDER BY [OK]
Common Mistakes:
  • Using GROUP BY instead of OVER clause
  • Using non-existent functions like RUNNING_TOTAL
  • Omitting ORDER BY in window function
3. Given the table sales with columns region, date, and amount, what is the output of this query?
SELECT region, date, amount, RANK() OVER (PARTITION BY region ORDER BY amount DESC) AS rank FROM sales;
medium
A. Ranks sales amounts within each region from highest to lowest
B. Ranks sales amounts across all regions ignoring region groups
C. Calculates cumulative sum of amounts per region
D. Returns the total number of sales per region

Solution

  1. Step 1: Understand RANK() with PARTITION BY and ORDER BY

    RANK() assigns ranks starting at 1 within each partition (region), ordering by amount descending.
  2. Step 2: Interpret the query output

    The query shows each sale with its rank in its region based on amount, highest amount ranked 1.
  3. Final Answer:

    Ranks sales amounts within each region from highest to lowest -> Option A
  4. Quick Check:

    RANK() OVER PARTITION BY region ORDER BY amount DESC = A [OK]
Hint: RANK() with PARTITION BY ranks within groups [OK]
Common Mistakes:
  • Thinking RANK() ignores PARTITION BY
  • Confusing RANK() with cumulative sum
  • Assuming ranks are across all rows without grouping
4. Identify the error in this Snowflake query:
SELECT employee_id, salary, ROW_NUMBER() OVER (ORDER BY salary) PARTITION BY department FROM employees;
medium
A. ORDER BY cannot be used in window functions
B. ROW_NUMBER() cannot be used with ORDER BY
C. PARTITION BY must come before ORDER BY inside OVER()
D. Missing GROUP BY clause for department

Solution

  1. Step 1: Check window function clause order

    In Snowflake, PARTITION BY must appear before ORDER BY inside the OVER() clause.
  2. Step 2: Identify syntax error

    The query places PARTITION BY after ORDER BY, which is invalid syntax.
  3. Final Answer:

    PARTITION BY must come before ORDER BY inside OVER() -> Option C
  4. Quick Check:

    PARTITION BY before ORDER BY in OVER() = D [OK]
Hint: PARTITION BY always before ORDER BY in OVER() [OK]
Common Mistakes:
  • Placing PARTITION BY after ORDER BY
  • Thinking ROW_NUMBER() disallows ORDER BY
  • Adding unnecessary GROUP BY for window functions
5. You want to calculate the average sales per region and also show each sale's rank by amount within its region. Which query correctly combines these using window functions?
hard
A. SELECT region, amount, AVG(amount) PARTITION BY region, RANK() ORDER BY amount DESC FROM sales;
B. SELECT region, amount, AVG(amount) OVER (PARTITION BY region) AS avg_region, RANK() OVER (PARTITION BY region ORDER BY amount DESC) AS rank FROM sales;
C. SELECT region, amount, AVG(amount), RANK() FROM sales GROUP BY region ORDER BY amount DESC;
D. SELECT region, amount, AVG(amount) OVER (), RANK() OVER (ORDER BY amount) FROM sales;

Solution

  1. Step 1: Use AVG() as window function partitioned by region

    AVG(amount) OVER (PARTITION BY region) calculates average sales per region without grouping rows.
  2. Step 2: Use RANK() partitioned by region ordered by amount descending

    RANK() OVER (PARTITION BY region ORDER BY amount DESC) ranks sales within each region.
  3. Step 3: Verify query correctness

    SELECT region, amount, AVG(amount) OVER (PARTITION BY region) AS avg_region, RANK() OVER (PARTITION BY region ORDER BY amount DESC) AS rank FROM sales; correctly uses window functions with proper syntax and clauses.
  4. Final Answer:

    SELECT region, amount, AVG(amount) OVER (PARTITION BY region) AS avg_region, RANK() OVER (PARTITION BY region ORDER BY amount DESC) AS rank FROM sales; -> Option B
  5. Quick Check:

    AVG() and RANK() with PARTITION BY region = C [OK]
Hint: Use OVER(PARTITION BY region) for both AVG and RANK [OK]
Common Mistakes:
  • Using GROUP BY instead of window functions
  • Incorrect syntax for window functions
  • Omitting PARTITION BY for per-region calculations