homework, pet project DE Dmitry_Medvedev #1

Open
dmitry_medvedev wants to merge 266 commits from md_branch into main
Showing only changes of commit 27f67be9da - Show all commits
@@ -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;