--5.1
SELECT DISTINCT user_id
FROM user_actions
ORDER BY user_id
--5.2
--Примените DISTINCT сразу к двум колонкам таблицы courier_actions
--и отберите уникальные пары значений courier_id и order_id
SELECT DISTINCT courier_id,
order_id
FROM courier_actions
ORDER BY courier_id, order_id
--5.3
SELECT max(price) max_price,
min(price) min_price
FROM products
--5.4
SELECT count(*) dates,
count(birth_date) dates_not_null
FROM users
--5.5
SELECT count(user_id) as users,
count(distinct user_id) as unique_users
FROM user_actions
--5.6
SELECT count(courier_id) as couriers
FROM couriers
WHERE sex = 'female'
--5.7
SELECT min(time) as first_delivery,
max(time) as last_delivery
FROM courier_actions
WHERE action = 'deliver_order'
--5.8
SELECT sum(price) order_price
FROM products
WHERE name in ('сухарики', 'чипсы', 'энергетический напиток')
--5.9
--количество заказов в таблице orders с девятью и более товарами
SELECT count(orders) as orders
FROM orders
WHERE array_length(product_ids, 1) >= 9
--5.10
--возраст самого молодого курьера мужского пола
SELECT min(age(current_date, birth_date)::varchar) as min_age
FROM couriers
WHERE sex = 'male'
--Вариант верного решения:
SELECT min(age(birth_date))::varchar as min_age
FROM couriers
WHERE sex = 'male'
--5.11
SELECT sum(case when name = 'сухарики' then price * 3
when name = 'чипсы' then price * 2
when name = 'энергетический напиток' then price end) as order_price
FROM products
--Вариант верного решения:
SELECT sum(case when name = 'сухарики' then price * 3
when name = 'чипсы' then price * 2
when name = 'энергетический напиток' then price
else 0 end) as order_price
FROM products
--5.12
SELECT round(avg(price), 2) as avg_price
FROM products
WHERE name like 'чай%'
and name not like '%гриб%'
or name like 'кофе %'
--Вариант верного решения:
SELECT round(avg(price), 2) as avg_price
FROM products
WHERE (name like '%чай%'
or name like '%кофе%')
and name not like '%иван-чай%'
and name not like 'чайный гриб'
--5.13
--рассчитайте разницу в возрасте между самым старым и самым молодым пользователями мужского пола
SELECT age(max(birth_date), min(birth_date))::varchar as age_diff
FROM users
WHERE sex = 'male'
--5.14
--среднее количество товаров в заказах
SELECT round(avg(array_length(product_ids, 1)), 2) as avg_order_size
FROM orders
WHERE date_part ('dow', creation_time) in ('6', '0')
--Вариант верного решения:
SELECT round(avg(array_length(product_ids, 1)), 2) as avg_order_size
FROM orders
WHERE date_part('dow', creation_time) in (6, 0)
--5.15
--количество уникальных пользователей сервиса, количество уникальных заказов,
--поделите одно на другое и выясните, сколько заказов приходится на одного пользователя.
SELECT count(distinct(user_id)) unique_users,
count(distinct(order_id)) unique_orders,
round(count(distinct(order_id))::decimal / count(distinct(user_id)),
2) orders_per_user
FROM user_actions
--5.16
--сколько пользователей никогда не отменяли свой заказ
SELECT count(distinct user_id) - count(distinct user_id)
filter (WHERE action = 'cancel_order') as users_count
FROM user_actions
--5.17
--общее количество заказов в таблице orders, количество заказов с пятью и более товарами
--и найдите долю заказов с пятью и более товарами в общем количестве заказов.
--При расчёте доли не забудьте хотя бы одно из значений предварительно привести к типу DECIMAL
SELECT count(order_id) as orders,
count(order_id) filter (WHERE array_length(product_ids, 1) >= 5) as large_orders,
round(count(order_id) filter (WHERE array_length(product_ids, 1) >= 5) :: decimal / count(order_id),
2) as large_orders_share
FROM orders
To embed this project on your website, copy the following code and paste it into your website's HTML: