Этап: Аналитические запросы
This commit is contained in:
1 parent
d90f1f30b2
commit
2ec0b38d95
10 files changed
+315
-1
No files matched your search
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
Reference in new issue
Block a user