87 lines
2.3 KiB
SQL
87 lines
2.3 KiB
SQL
/*
|
||
Задача 1:
|
||
|
||
Для каждой категории показать 2 строки:
|
||
- Самый дорогой товар с email'ом
|
||
- Самый дорогой товар без email'а
|
||
*/
|
||
with with_mail as (
|
||
select category, name, price, email_support
|
||
from (
|
||
select category, name, price, email_support,
|
||
row_number() over (partition by category order by price desc) as rn
|
||
from products_extended
|
||
where email_support is not null
|
||
) t
|
||
where rn = 1
|
||
),
|
||
without_mail as (
|
||
select category, name, price, email_support
|
||
from (
|
||
select category, name, price, email_support,
|
||
row_number() over (partition by category order by price desc) as rn
|
||
from products_extended
|
||
where email_support is null
|
||
) t
|
||
where rn = 1
|
||
)
|
||
|
||
select * from with_mail
|
||
union all
|
||
select * from without_mail
|
||
order by category;
|
||
|
||
/*
|
||
Задача 2:
|
||
|
||
Для каждого товара показать:
|
||
|
||
- `name` — название товара
|
||
- `category` — категория товара
|
||
- `price` — цена текущего товара
|
||
- `next_price` — цена следующего товара внутри той же категории, упорядоченного по цене
|
||
- `diff` — разница между ценой текущего товара и ценой следующего товара
|
||
(`price - next_price`)
|
||
*/
|
||
|
||
with t as(
|
||
select name, category, price,
|
||
lead(price) over (partition by category order by price) as next_price
|
||
from products_extended)
|
||
select name, category, price, next_price,
|
||
price - next_price as diff
|
||
from t order by category;
|
||
|
||
/*
|
||
Задача 3:
|
||
|
||
Показать `category`, `name`, `price`, `cumulative_sales`
|
||
|
||
Где `cumulative_sales` — это сумма `price` **внутри категории** по мере возрастания цены
|
||
*/
|
||
|
||
select category, name, price,
|
||
sum(price) over (partition by category order by price) as cumulative_sales
|
||
from products_extended;
|
||
|
||
/*
|
||
Задача 4:
|
||
|
||
Вывести `category`, `name`, `price`, `avg_price`, `is_above_avg`
|
||
|
||
Где `avg_price` — средняя цена по категории
|
||
|
||
`is_above_avg = true`, если `price > avg_price`
|
||
|
||
*/
|
||
|
||
|
||
with t as(
|
||
select category, name, price,
|
||
round(avg(price) over (partition by category), 1) as avg_price
|
||
from products_extended)
|
||
select category, name, price, avg_price,
|
||
price > avg_price as is_above_avg
|
||
from t order by category;
|
||
|