на примере из курса Карпова и на рабочем примере.
Как всем известно этот оператор группирует строки и потом используя агрегирующие функции (SUM, AVG, COUNT, MIN, MAX ) над элементами этих групп и проводятся определённые операции.
Но просто один GROUP BY – это слишком легко, поэтому мы им воспользуемся вместе с CASE, а в случае рабочего примера еще и с подзапросом. Мощно, да? 💪
🔹Итак, это пример задания у Карпова:
Группу с выходными днями (суббота и воскресенье) назовите «weekend», а группу с будними днями (с понедельника по пятницу) — «weekdays».
В результат включите две колонки: колонку с группами назовите week_part, а колонку со средним размером заказа — avg_order_size.
SELECT
case
when date_part('dow', creation_time) in (0, 6) then 'weekend'
else 'weekdays'
end as week_part,
round(avg(array_length(product_ids, 1)), 2) as avg_order_size
FROM orders
GROUP BY 1 ORDER BY 2
Мы сначала определяем каждую строку как weekend или как weekdays, а потом их группируем с помощью GROUP BY и подсчитываем средний размер заказа в каждой группе.
🔹 А теперь покажу, как похожая структура используется на рабочем примере. Есть заявки от клиентов с разными статусами. Нужно найти по каждому финальному статусу количество клиентов – скольким одобрено, скольким отказано, скольким требуется исправление в заявке и т.д.
Тут еще используется подзапрос. Он необходим, так как я подсчитываю кол-во уже базируясь на данных сформировавшихся после case.
select status, count(*) as count_account_id
from(
select account_id,
(case when MAX(status) = 1 then 'Новый'
when MAX(status) = 2 then 'В работе'
when MAX(status) = 3 then 'Требуется исправления'
when MAX(status) = 5 then 'Одобрено'
when MAX(status) = 6 then 'Отказано'
else MAX(status) end) as status
from sales.checkout_request
group by 1
) tt
group by 1 order by status desc
Я обозначила результат подзапроса как tt иначе код выдаст ошибку. Всегда нужно давать имя подзапросу, который находится внутри from.
Обсуждение 2
Обсуждение не доступно в веб-версии. Чтобы написать комментарий, перейдите в приложение Telegram.
Обсудить в Telegram