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