/* Задание 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;