Нормализация недельной нормы (3.28.0)
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 1m29s
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 1m29s
This commit is contained in:
10
play-life-backend/migrations/026_weekly_goals_max_score.sql
Normal file
10
play-life-backend/migrations/026_weekly_goals_max_score.sql
Normal file
@@ -0,0 +1,10 @@
|
||||
-- Migration: Add weekly_goals.max_score snapshot column and drop unused actual_score
|
||||
-- Date: 2026-01-24
|
||||
|
||||
ALTER TABLE weekly_goals
|
||||
DROP COLUMN IF EXISTS actual_score;
|
||||
|
||||
-- max_score is a snapshot of max_goal_score for a week, filled only for new weeks by cron
|
||||
ALTER TABLE weekly_goals
|
||||
ADD COLUMN IF NOT EXISTS max_score NUMERIC(10,4);
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
-- Migration: Add normalized_total_score to weekly_report_mv using weekly_goals.max_score
|
||||
-- Date: 2026-01-24
|
||||
--
|
||||
-- normalized_total_score = LEAST(total_score, max_score) if max_score is set, else total_score.
|
||||
-- Note: max_score is a snapshot field (filled only for new weeks by cron).
|
||||
|
||||
DROP MATERIALIZED VIEW IF EXISTS weekly_report_mv;
|
||||
|
||||
CREATE MATERIALIZED VIEW weekly_report_mv AS
|
||||
SELECT
|
||||
p.id AS project_id,
|
||||
agg.report_year,
|
||||
agg.report_week,
|
||||
COALESCE(agg.total_score, 0.0000) AS total_score,
|
||||
CASE
|
||||
WHEN wg.max_score IS NULL THEN COALESCE(agg.total_score, 0.0000)
|
||||
ELSE LEAST(COALESCE(agg.total_score, 0.0000), wg.max_score)
|
||||
END AS normalized_total_score
|
||||
FROM
|
||||
projects p
|
||||
LEFT JOIN
|
||||
(
|
||||
SELECT
|
||||
n.project_id,
|
||||
EXTRACT(ISOYEAR FROM e.created_date)::INTEGER AS report_year,
|
||||
EXTRACT(WEEK FROM e.created_date)::INTEGER AS report_week,
|
||||
SUM(n.score) AS total_score
|
||||
FROM
|
||||
nodes n
|
||||
JOIN
|
||||
entries e ON n.entry_id = e.id
|
||||
GROUP BY
|
||||
1, 2, 3
|
||||
) agg
|
||||
ON p.id = agg.project_id
|
||||
LEFT JOIN
|
||||
weekly_goals wg
|
||||
ON wg.project_id = p.id
|
||||
AND wg.goal_year = agg.report_year
|
||||
AND wg.goal_week = agg.report_week
|
||||
WHERE
|
||||
p.deleted = FALSE
|
||||
ORDER BY
|
||||
p.id, agg.report_year, agg.report_week
|
||||
WITH DATA;
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_weekly_report_mv_project_year_week
|
||||
ON weekly_report_mv(project_id, report_year, report_week);
|
||||
|
||||
COMMENT ON MATERIALIZED VIEW weekly_report_mv IS 'Materialized view aggregating weekly scores by project using ISOYEAR for correct week calculations at year boundaries. Includes all projects via LEFT JOIN. Adds normalized_total_score using weekly_goals.max_score snapshot.';
|
||||
|
||||
@@ -45,7 +45,7 @@ docker-compose exec db psql -U playeng -d playeng -f /migrations/001_create_sche
|
||||
- `goal_week` (INTEGER NOT NULL)
|
||||
- `min_goal_score` (NUMERIC(10,4) NOT NULL, DEFAULT 0)
|
||||
- `max_goal_score` (NUMERIC(10,4))
|
||||
- `actual_score` (NUMERIC(10,4), DEFAULT 0)
|
||||
- `max_score` (NUMERIC(10,4), NULL) — snapshot max на неделю (заполняется только для новых недель)
|
||||
- `priority` (SMALLINT)
|
||||
- UNIQUE CONSTRAINT: `(project_id, goal_year, goal_week)`
|
||||
|
||||
@@ -56,6 +56,7 @@ docker-compose exec db psql -U playeng -d playeng -f /migrations/001_create_sche
|
||||
- `report_year` (INTEGER)
|
||||
- `report_week` (INTEGER)
|
||||
- `total_score` (NUMERIC)
|
||||
- `normalized_total_score` (NUMERIC)
|
||||
|
||||
## Миграции
|
||||
|
||||
@@ -67,6 +68,8 @@ docker-compose exec db psql -U playeng -d playeng -f /migrations/001_create_sche
|
||||
4. **004_add_config_dictionaries.sql** - Добавление связи между конфигурациями и словарями
|
||||
5. **005_fix_weekly_report_mv.sql** - Исправление использования ISOYEAR вместо YEAR для корректной работы на границе года
|
||||
6. **006_fix_weekly_report_mv_structure.sql** - Исправление структуры view (добавление LEFT JOIN для включения всех проектов)
|
||||
7. **026_weekly_goals_max_score.sql** - Добавление snapshot поля weekly_goals.max_score и удаление неиспользуемого actual_score
|
||||
8. **027_add_normalized_total_score_to_weekly_report_mv.sql** - Добавление normalized_total_score в weekly_report_mv (ограничение total_score по max_score)
|
||||
|
||||
### Применение миграций
|
||||
|
||||
@@ -75,6 +78,8 @@ docker-compose exec db psql -U playeng -d playeng -f /migrations/001_create_sche
|
||||
```bash
|
||||
psql -U playeng -d playeng -f migrations/005_fix_weekly_report_mv.sql
|
||||
psql -U playeng -d playeng -f migrations/006_fix_weekly_report_mv_structure.sql
|
||||
psql -U playeng -d playeng -f migrations/026_weekly_goals_max_score.sql
|
||||
psql -U playeng -d playeng -f migrations/027_add_normalized_total_score_to_weekly_report_mv.sql
|
||||
```
|
||||
|
||||
Или через docker-compose:
|
||||
@@ -82,6 +87,8 @@ psql -U playeng -d playeng -f migrations/006_fix_weekly_report_mv_structure.sql
|
||||
```bash
|
||||
docker-compose exec db psql -U playeng -d playeng -f /migrations/005_fix_weekly_report_mv.sql
|
||||
docker-compose exec db psql -U playeng -d playeng -f /migrations/006_fix_weekly_report_mv_structure.sql
|
||||
docker-compose exec db psql -U playeng -d playeng -f /migrations/026_weekly_goals_max_score.sql
|
||||
docker-compose exec db psql -U playeng -d playeng -f /migrations/027_add_normalized_total_score_to_weekly_report_mv.sql
|
||||
```
|
||||
|
||||
## Обновление Materialized View
|
||||
|
||||
Reference in New Issue
Block a user