0
0
PostgreSQLquery~20 mins

Window frame (ROWS BETWEEN, RANGE BETWEEN) in PostgreSQL - Practice Problems & Coding Challenges

Choose your learning style9 modes available
Challenge - 5 Problems
🎖️
Window Frame Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
query_result
intermediate
2:00remaining
Output of ROWS BETWEEN window frame
Given the table sales with columns id, region, and amount, what is the output of the following query?
SELECT id, region, amount,
SUM(amount) OVER (PARTITION BY region ORDER BY id ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS running_sum
FROM sales
ORDER BY id;
PostgreSQL
CREATE TABLE sales (id INT, region TEXT, amount INT);
INSERT INTO sales VALUES
(1, 'North', 100),
(2, 'North', 200),
(3, 'South', 150),
(4, 'North', 50),
(5, 'South', 100);
A[{"id":1,"region":"North","amount":100,"running_sum":100},{"id":2,"region":"North","amount":200,"running_sum":300},{"id":3,"region":"South","amount":150,"running_sum":150},{"id":4,"region":"North","amount":50,"running_sum":350},{"id":5,"region":"South","amount":250,"running_sum":250}]
B[{"id":1,"region":"North","amount":100,"running_sum":100},{"id":2,"region":"North","amount":200,"running_sum":300},{"id":3,"region":"South","amount":150,"running_sum":150},{"id":4,"region":"North","amount":50,"running_sum":250},{"id":5,"region":"South","amount":100,"running_sum":250}]
C[{"id":1,"region":"North","amount":100,"running_sum":100},{"id":2,"region":"North","amount":200,"running_sum":200},{"id":3,"region":"South","amount":150,"running_sum":150},{"id":4,"region":"North","amount":50,"running_sum":50},{"id":5,"region":"South","amount":100,"running_sum":100}]
D[{"id":1,"region":"North","amount":100,"running_sum":100},{"id":2,"region":"North","amount":200,"running_sum":300},{"id":3,"region":"South","amount":150,"running_sum":250},{"id":4,"region":"North","amount":50,"running_sum":250},{"id":5,"region":"South","amount":100,"running_sum":350}]
Attempts:
2 left
💡 Hint
Remember that ROWS BETWEEN 1 PRECEDING AND CURRENT ROW includes the current row and the one before it within the same partition.
query_result
intermediate
2:00remaining
Output of RANGE BETWEEN window frame
Using the same sales table, what is the output of this query?
SELECT id, region, amount,
SUM(amount) OVER (PARTITION BY region ORDER BY amount RANGE BETWEEN 50 PRECEDING AND CURRENT ROW) AS running_sum
FROM sales
ORDER BY id;
PostgreSQL
CREATE TABLE sales (id INT, region TEXT, amount INT);
INSERT INTO sales VALUES
(1, 'North', 100),
(2, 'North', 200),
(3, 'South', 150),
(4, 'North', 50),
(5, 'South', 100);
A[{"id":1,"region":"North","amount":100,"running_sum":100},{"id":2,"region":"North","amount":200,"running_sum":200},{"id":3,"region":"South","amount":150,"running_sum":150},{"id":4,"region":"North","amount":50,"running_sum":50},{"id":5,"region":"South","amount":100,"running_sum":100}]
B[{"id":1,"region":"North","amount":100,"running_sum":300},{"id":2,"region":"North","amount":200,"running_sum":200},{"id":3,"region":"South","amount":150,"running_sum":250},{"id":4,"region":"North","amount":50,"running_sum":150},{"id":5,"region":"South","amount":100,"running_sum":100}]
C[{"id":1,"region":"North","amount":100,"running_sum":150},{"id":2,"region":"North","amount":200,"running_sum":200},{"id":3,"region":"South","amount":150,"running_sum":250},{"id":4,"region":"North","amount":50,"running_sum":50},{"id":5,"region":"South","amount":100,"running_sum":100}]
D[{"id":1,"region":"North","amount":100,"running_sum":250},{"id":2,"region":"North","amount":200,"running_sum":200},{"id":3,"region":"South","amount":150,"running_sum":250},{"id":4,"region":"North","amount":50,"running_sum":150},{"id":5,"region":"South","amount":100,"running_sum":100}]
Attempts:
2 left
💡 Hint
RANGE BETWEEN considers the values of the ORDER BY column, not row positions.
📝 Syntax
advanced
1:30remaining
Identify the syntax error in window frame clause
Which option contains a syntax error in the window frame clause of this query?
SELECT id, amount,
SUM(amount) OVER (ORDER BY id ROWS BETWEEN CURRENT ROW AND 1 PRECEDING) AS sum_amount
FROM sales;
AROWS BETWEEN 1 PRECEDING AND CURRENT ROW
BROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
CROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
DROWS BETWEEN CURRENT ROW AND 1 PRECEDING
Attempts:
2 left
💡 Hint
The frame boundaries must be in logical order: start before end.
optimization
advanced
2:00remaining
Optimizing window frame for cumulative sum
Which window frame clause is the most efficient and correct to calculate a cumulative sum of amount ordered by id over the entire table?
SELECT id, amount,
SUM(amount) OVER (ORDER BY id ) AS cumulative_sum
FROM sales;
AROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
BRANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
CROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
DRANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
Attempts:
2 left
💡 Hint
Cumulative sum means summing all rows from the start up to the current row.
🧠 Conceptual
expert
2:30remaining
Effect of RANGE BETWEEN with non-numeric ORDER BY
Consider this query:
SELECT id, category, amount,
SUM(amount) OVER (PARTITION BY category ORDER BY category RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS sum_amount
FROM sales;

What will be the effect of using RANGE BETWEEN with ORDER BY category where category is a text column?
AIt will treat all rows in the partition as peers and sum all amounts, resulting in the same sum for every row in each category.
BIt will raise an error because RANGE frame requires numeric or date ORDER BY columns.
CIt will behave like ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW, summing rows up to current row.
DIt will sum only the current row's amount because text ordering cannot define a range.
Attempts:
2 left
💡 Hint
RANGE frame treats peers with the same ORDER BY value as a group.