Sobes.tech
Intern

**SQL დავალებები** 1) გამოიტანეთ "processing" სტატუსის შეკვეთების რაოდენობა თითოეულ შემსრულებელზე (executor) მარტის 2024-ისთვის მხოლოდ პრიორიტეტული (priority = 'high') შეკვეთებისთვის. დალაგეთ რაოდენობის მიხედვით კლებადობით. გამორიცხეთ შემსრულებლები, რომლებსაც 0 შეკვეთა აქვთ. 2) გამოიტანეთ წარმატებით დასრულებული (completed) შეკვეთების რაოდენობა კატეგორიების მიხედვით, სადაც საშუალო შემოსავალი > 70000, და მხოლოდ იმ შეკვეთებს გაითვალისწინეთ, სადაც მომხმარებლის ID >= 1002. გამორიცხეთ კატეგორიები, სადაც საშუალო შემოსავალი უცნობია. 3) დაამატეთ orders_log ცხრილში rank სვეტი, რომელიც კლასიფიცირებს ჩანაწერებს თითოეულ შემსრულებელზე (executor) timestamp-ის მიხედვით ზრდადობით, მაგრამ მხოლოდ "pending" ან "processing" სტატუსის შეკვეთებისთვის. მაგალითის შედეგი (executor=1):

sobes.tech AI

პასუხი AI-სგან

  1. Количество заказов в статусе "processing" по каждому исполнителю за март 2024 года для приоритетных заказов:
SELECT executor, COUNT(*) AS orders_count
FROM orders
WHERE status = 'processing'
  AND priority = 'high'
  AND order_date >= '2024-03-01' AND order_date < '2024-04-01'
GROUP BY executor
HAVING COUNT(*) > 0
ORDER BY orders_count DESC;
  1. Количество успешно завершённых заказов по категориям, где средняя выручка > 70000, учитывая только клиентов с ID >= 1002:
SELECT category, COUNT(*) AS completed_orders
FROM orders
WHERE status = 'completed'
  AND client_id >= 1002
GROUP BY category
HAVING AVG(revenue) > 70000;
  1. Добавление столбца rank в таблицу orders_log для ранжирования записей по timestamp для каждого исполнителя, но только для заказов со статусом "pending" или "processing":
ALTER TABLE orders_log ADD COLUMN rank INT;

WITH ranked AS (
  SELECT id, 
         ROW_NUMBER() OVER (PARTITION BY executor ORDER BY timestamp ASC) AS rn
  FROM orders_log
  WHERE status IN ('pending', 'processing')
)
UPDATE orders_log ol
SET rank = r.rn
FROM ranked r
WHERE ol.id = r.id;

Если нужна динамическая выдача с ранжированием без изменения структуры, можно использовать оконную функцию в SELECT.