Merge branch 'main' into OS-415
This commit is contained in:
@@ -0,0 +1,152 @@
|
||||
/* Задание 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,
|
||||
sum(oi.quantity * oi.price_at_purchase) AS order_revenue -- добавил агреграт по всем поз. в заказе
|
||||
FROM
|
||||
order_items oi
|
||||
GROUP BY oi.order_id
|
||||
)
|
||||
SELECT
|
||||
u.id AS user_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
|
||||
) 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
|
||||
WHERE o.status NOT IN ('cancelled', 'refunded') -- добавил условие не включать отмененные заказы
|
||||
|
||||
|
||||
|
||||
/* Задание 3 */
|
||||
|
||||
WITH user_revenue_cte AS (
|
||||
SELECT
|
||||
o.user_id,
|
||||
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
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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;
|
||||
|
||||
@@ -0,0 +1,158 @@
|
||||
/* Задача 1
|
||||
* Джойним в таком порядке т.к. не каждый юзер делал заказ
|
||||
* + судя по порядку колонок мы хотим анализировать заказы
|
||||
* (по сути выглядит так же как INNER)
|
||||
* Но в обратном порядке можем увидеть кто не делал заказ
|
||||
* и добавить их в условную рассылку
|
||||
*/
|
||||
SELECT
|
||||
o.id AS order_id,
|
||||
o.order_date,
|
||||
status,
|
||||
u."name" AS user_name,
|
||||
country
|
||||
FROM
|
||||
orders o
|
||||
LEFT JOIN
|
||||
users u ON o.user_id = u.id
|
||||
|
||||
|
||||
/* Задача 2 */
|
||||
|
||||
SELECT
|
||||
order_id,
|
||||
p."name" AS product_name,
|
||||
quantity,
|
||||
price_at_purchase
|
||||
FROM
|
||||
order_items oi
|
||||
LEFT JOIN
|
||||
products p ON oi.product_id = p.id -- AND oi.order_id = 1 из правой таблицы будут NULL там, где оба условия не выполнены
|
||||
WHERE order_id = 1 -- в задании другой номер - 101, надо исправить в Notion, данные на п.4 уже другие
|
||||
|
||||
|
||||
/* Задача 3 */
|
||||
|
||||
SELECT
|
||||
order_id,
|
||||
u."name" AS user_name,
|
||||
p."name" AS product_name,
|
||||
quantity,
|
||||
price_at_purchase
|
||||
FROM
|
||||
orders o
|
||||
LEFT JOIN
|
||||
order_items oi ON o.id = oi.order_id
|
||||
INNER JOIN
|
||||
users u ON o.user_id = u.id
|
||||
INNER JOIN
|
||||
products p ON oi.product_id = p.id;
|
||||
|
||||
|
||||
/* Задача 4 */
|
||||
|
||||
SELECT
|
||||
u."name" AS user_name,
|
||||
o.id AS order_id,
|
||||
status
|
||||
FROM
|
||||
users u
|
||||
LEFT JOIN
|
||||
orders o ON u.id = o.user_id
|
||||
|
||||
|
||||
/* Задача 5 */
|
||||
|
||||
SELECT
|
||||
o.user_id,
|
||||
u."name" AS user_name
|
||||
FROM
|
||||
users u
|
||||
LEFT JOIN
|
||||
orders o ON u.id = o.user_id
|
||||
WHERE o.user_id IS NOT NULL
|
||||
|
||||
|
||||
/* Задача 6 */
|
||||
|
||||
SELECT
|
||||
o.id AS order_id,
|
||||
u.name AS user_name,
|
||||
p.name AS product_name,
|
||||
quantity
|
||||
FROM
|
||||
orders o
|
||||
LEFT JOIN
|
||||
order_items oi ON o.id = oi.order_id
|
||||
INNER JOIN
|
||||
products p ON oi.product_id = p.id
|
||||
INNER JOIN
|
||||
users u ON o.user_id = u.id
|
||||
WHERE p."name" ILIKE '%Mi Band 7%';
|
||||
|
||||
|
||||
/* Задача 7 */
|
||||
|
||||
SELECT
|
||||
p.name AS product_name,
|
||||
order_id,
|
||||
quantity
|
||||
FROM
|
||||
products p
|
||||
FULL JOIN
|
||||
order_items oi ON p.id = oi.product_id
|
||||
ORDER BY product_name;
|
||||
|
||||
|
||||
/* Задача 8 */
|
||||
|
||||
SELECT
|
||||
o.id,
|
||||
u."name" AS user_name,
|
||||
p."name" AS product_name,
|
||||
quantity,
|
||||
price_at_purchase
|
||||
FROM
|
||||
orders o
|
||||
LEFT JOIN
|
||||
order_items oi ON o.id = oi.order_id
|
||||
INNER JOIN
|
||||
users u ON o.user_id = u.id
|
||||
LEFT JOIN
|
||||
products p ON oi.product_id = p.id
|
||||
WHERE
|
||||
o.status = 'paid';
|
||||
|
||||
|
||||
/* Задача 9 */
|
||||
|
||||
SELECT
|
||||
o.id AS order_id,
|
||||
o.order_date,
|
||||
p."name" AS product_name,
|
||||
quantity,
|
||||
price_at_purchase
|
||||
FROM
|
||||
orders o
|
||||
LEFT JOIN
|
||||
order_items oi ON o.id = oi.order_id
|
||||
INNER JOIN
|
||||
products p ON oi.product_id = p.id
|
||||
INNER JOIN
|
||||
users u ON o.user_id = u.id
|
||||
WHERE u."name" ILIKE '%alice%';
|
||||
|
||||
|
||||
/* Задача 10
|
||||
* Задача противоречит изначальным органичениям NOT NULL
|
||||
*/
|
||||
|
||||
SELECT
|
||||
o.id AS order_id,
|
||||
user_id,
|
||||
status
|
||||
FROM
|
||||
orders o
|
||||
FULL JOIN
|
||||
order_items oi ON oi.order_id = o.id
|
||||
WHERE product_id IS NULL AND o.status = 'created';
|
||||
Reference in New Issue
Block a user