Этап: Аналитические запросы

This commit is contained in:
vladslav064 committed 2026-11-12 08:52:15 +03:00
1 parent d90f1f30b2
commit 2ec0b38d95
10 files changed
+315 -1

No files matched your search

+33
View File
@@ -0,0 +1,33 @@
WITH RECURSIVE calendar(day, last_day) AS (
SELECT MIN(order_date), MAX(order_date) FROM daily_category_revenue
HAVING COUNT(*) > 0
UNION ALL
SELECT date(day, '+1 day'), last_day FROM calendar WHERE day < last_day
),
categories AS (
SELECT DISTINCT category FROM daily_category_revenue
),
daily AS (
SELECT day, c.category, COALESCE(r.revenue_kopecks, 0) AS revenue_kopecks
FROM calendar CROSS JOIN categories AS c
LEFT JOIN daily_category_revenue AS r ON r.order_date = day AND r.category = c.category
),
-- Вычитаем общий для категории минимум в целых копейках до перехода AVG к REAL.
-- Такой сдвиг сохраняет отклонения и различия в копейку при большом базовом уровне.
shifted AS (
SELECT *, revenue_kopecks - MIN(revenue_kopecks) OVER (PARTITION BY category) AS amount
FROM daily
),
deviations AS (
SELECT *, amount - AVG(amount) OVER (PARTITION BY category) AS deviation
FROM shifted
),
stats AS (
SELECT *, COUNT(*) OVER (PARTITION BY category) AS days,
AVG(deviation * deviation) OVER (PARTITION BY category) AS variance
FROM deviations
)
SELECT day AS order_date, category, revenue_kopecks
FROM stats
WHERE days >= 7 AND variance > 0 AND deviation * deviation > 4 * variance
ORDER BY day, category;
+16
View File
@@ -0,0 +1,16 @@
WITH RECURSIVE calendar(day, last_day) AS (
SELECT MIN(order_date), MAX(order_date) FROM daily_category_revenue
HAVING COUNT(*) > 0
UNION ALL
SELECT date(day, '+1 day'), last_day FROM calendar WHERE day < last_day
),
daily AS (
SELECT day AS order_date, COALESCE(SUM(r.revenue_kopecks), 0) AS revenue_kopecks
FROM calendar
LEFT JOIN daily_category_revenue AS r ON r.order_date = day
GROUP BY day
)
SELECT order_date, revenue_kopecks,
revenue_kopecks - LAG(revenue_kopecks) OVER (ORDER BY order_date) AS change_kopecks
FROM daily
ORDER BY order_date;
+7
View File
@@ -0,0 +1,7 @@
SELECT category,
SUM(order_count) AS order_count,
SUM(revenue_kopecks) AS revenue_kopecks
FROM daily_category_revenue
GROUP BY category
ORDER BY revenue_kopecks DESC, category
LIMIT 5;