From 27f67be9da1d3721c11631def791b081567ce4e8 Mon Sep 17 00:00:00 2001 From: pavel Date: Fri, 20 Feb 2026 22:03:55 +0100 Subject: [PATCH 1/2] feat(sql): complete window functions homework --- .../postgresql/homework_window_functions.sql | 151 ++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 pmikhailov/postgresql/homework_window_functions.sql diff --git a/pmikhailov/postgresql/homework_window_functions.sql b/pmikhailov/postgresql/homework_window_functions.sql new file mode 100644 index 0000000..81b0974 --- /dev/null +++ b/pmikhailov/postgresql/homework_window_functions.sql @@ -0,0 +1,151 @@ +/* Задание 1 */ + +SELECT + u.id, + u."name", + o.id AS order_id, + o.order_date, + ROW_NUMBER() OVER ( + PARTITION BY u.id + ORDER BY o.order_date) AS order_number_for_user +FROM + users u +INNER JOIN + orders o ON u.id = o.user_id + + +/* Задание 2 */ + +WITH order_revenue_cte AS ( + SELECT + oi.order_id, + oi.quantity * oi.price_at_purchase AS order_revenue + FROM + order_items oi + ) +SELECT + u.id, + u."name", + o.id AS order_id, + o.order_date, + orc.order_revenue, + sum(orc.order_revenue) OVER ( + PARTITION BY u.id + ORDER BY o.order_date + ROWS UNBOUNDED PRECEDING + ) AS running_revenue_for_user +FROM + users u +INNER JOIN + orders o ON u.id = o.user_id +INNER JOIN + order_revenue_cte orc ON o.id = orc.order_id + + +/* Задание 3 */ + +WITH user_revenue_cte AS ( + SELECT + o.user_id, + oi.quantity * oi.price_at_purchase AS order_revenue, + sum(oi.quantity * oi.price_at_purchase) OVER ( + PARTITION BY o.user_id) AS user_total_revenue + FROM + orders o + INNER JOIN + order_items oi ON o.id = oi.order_id) +SELECT DISTINCT + u."name", + urc.user_total_revenue, + RANK() OVER (ORDER BY urc.user_total_revenue DESC) AS revenue_rank, + DENSE_RANK() OVER (ORDER BY urc.user_total_revenue DESC) AS revenue_dense_rank +FROM + users u +INNER JOIN + user_revenue_cte urc ON u.id = urc.user_id + + +/* Задание 4 */ + +SELECT + u.name AS user_name, + o.id AS order_id, + o.order_date, + FIRST_VALUE(o.order_date) OVER ( + PARTITION BY o.user_id + ORDER BY o.order_date + ) AS first_order_date, + LAST_VALUE(o.order_date) OVER ( + PARTITION BY o.user_id + ORDER BY o.order_date + ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING + ) AS last_order_date +FROM + users u +INNER JOIN + orders o ON u.id = o.user_id; + + +/* Задание 5 */ + +SELECT + u.name, + o.id, + count(o.id) OVER ( + PARTITION BY o.user_id) AS orders_per_user +FROM + users u +INNER JOIN + orders o ON u.id = o.user_id + + +/* Задание 6 */ + +WITH order_revenue_cte AS ( + SELECT + oi.order_id, + oi.quantity * oi.price_at_purchase AS order_revenue + FROM + order_items oi + ) +SELECT + u.name, + o.id, + o.order_date, + orc.order_revenue, + lag(orc.order_revenue) OVER ( + PARTITION BY o.user_id + ORDER BY o.order_date + ) AS prev_order_revenue +FROM + users u +INNER JOIN + orders o ON u.id = o.user_id +INNER JOIN + order_revenue_cte orc ON o.id = orc.order_id + + +/* Задание 7 */ + +WITH category_revenue_cte AS ( + SELECT + p.category, + date_trunc('day', o.order_date)::date AS order_period, + sum(oi.quantity * oi.price_at_purchase) AS daily_category_revenue + FROM + products p + LEFT JOIN + order_items oi ON p.id = oi.product_id + INNER JOIN + orders o ON oi.order_id = o.id + GROUP BY 1, 2) +SELECT + cr_cte.*, + sum(cr_cte.daily_category_revenue) OVER ( + PARTITION BY cr_cte.category + ORDER BY cr_cte.order_period + ROWS UNBOUNDED PRECEDING + ) AS running_category_revenue +FROM + category_revenue_cte cr_cte; + \ No newline at end of file From fc41b7ce31a6917a57207337beafd1aee2367f9c Mon Sep 17 00:00:00 2001 From: pavel Date: Sat, 6 Jun 2026 21:22:55 +0200 Subject: [PATCH 2/2] fix(sql):window func - hw mistakes corrected --- .../postgresql/homework_window_functions.sql | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/pmikhailov/postgresql/homework_window_functions.sql b/pmikhailov/postgresql/homework_window_functions.sql index 81b0974..4b799ea 100644 --- a/pmikhailov/postgresql/homework_window_functions.sql +++ b/pmikhailov/postgresql/homework_window_functions.sql @@ -19,12 +19,13 @@ INNER JOIN WITH order_revenue_cte AS ( SELECT oi.order_id, - oi.quantity * oi.price_at_purchase AS order_revenue + sum(oi.quantity * oi.price_at_purchase) AS order_revenue -- добавил агреграт по всем поз. в заказе FROM order_items oi + GROUP BY oi.order_id ) SELECT - u.id, + u.id AS user_id , u."name", o.id AS order_id, o.order_date, @@ -32,7 +33,6 @@ SELECT sum(orc.order_revenue) OVER ( PARTITION BY u.id ORDER BY o.order_date - ROWS UNBOUNDED PRECEDING ) AS running_revenue_for_user FROM users u @@ -40,6 +40,8 @@ INNER JOIN orders o ON u.id = o.user_id INNER JOIN order_revenue_cte orc ON o.id = orc.order_id +WHERE o.status NOT IN ('cancelled', 'refunded') -- добавил условие не включать отмененные заказы + /* Задание 3 */ @@ -47,14 +49,13 @@ INNER JOIN WITH user_revenue_cte AS ( SELECT o.user_id, - oi.quantity * oi.price_at_purchase AS order_revenue, - sum(oi.quantity * oi.price_at_purchase) OVER ( - PARTITION BY o.user_id) AS user_total_revenue + sum(oi.quantity * oi.price_at_purchase) AS user_total_revenue FROM orders o INNER JOIN - order_items oi ON o.id = oi.order_id) -SELECT DISTINCT + order_items oi ON o.id = oi.order_id + GROUP BY o.user_id) -- добавил group by, костыль убран +SELECT u."name", urc.user_total_revenue, RANK() OVER (ORDER BY urc.user_total_revenue DESC) AS revenue_rank, @@ -62,7 +63,7 @@ SELECT DISTINCT FROM users u INNER JOIN - user_revenue_cte urc ON u.id = urc.user_id + user_revenue_cte urc ON u.id = urc.user_id; /* Задание 4 */ @@ -104,10 +105,10 @@ INNER JOIN WITH order_revenue_cte AS ( SELECT oi.order_id, - oi.quantity * oi.price_at_purchase AS order_revenue + sum(oi.quantity * oi.price_at_purchase) AS order_revenue FROM order_items oi - ) + GROUP BY oi.order_id) -- добавил group by по order_id, теперь это сумма всего заказа, а не строки SELECT u.name, o.id, @@ -122,7 +123,7 @@ FROM INNER JOIN orders o ON u.id = o.user_id INNER JOIN - order_revenue_cte orc ON o.id = orc.order_id + order_revenue_cte orc ON o.id = orc.order_id; /* Задание 7 */