--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

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: