151 lines
3.0 KiB
SQL
151 lines
3.0 KiB
SQL
/* Задание 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;
|
|
|