2.0 KiB
Передача sql-pro
Владение второй волны: sql/, reports/sql/, этот handoff. Итоговая БД открывается URI mode=ro; runner использует одну read transaction на все три запроса.
Выполнено Python 3.12.14:
python sql/run_queries.py --db output/sales.sqlite --output reports/sql
Результат: top_categories 3 строки, daily_dynamics 30 строк, anomalies 1 строка. Категории (копейки): книги 39904885; электроника 33008050; дом 26206460. Динамика покрывает 2026-01-01..2026-01-30, 2026-01-13 = 0; изменение первого дня NULL (в CSV пусто).
Аномалия: 2026-01-23, выручка 45144920 коп., сумма предыдущих семи календарных дней 13009083 коп. Порог: выручка > трех средних предыдущих 7 дней при 7 днях истории и ненулевой базе. Точный целочисленный порог floor(13009083*3/7)=5575321 коп. Это аналитический сигнал намеренно заложенного синтетического пика, не дефект строки.
Дополнительный фактический запуск в tempfile: пустой ETL дает все три SQL результата по 0 строк с CSV заголовками; повторный SQL запуск дает те же CSV байты. PASS. Сравниваются CSV, а не SQLite-файлы.
SQL использует SQLite window functions и рекурсивный календарь; полный диапазон дат строится в памяти/SQLite, для огромных диапазонов не оптимизирован. Денежные итоги остаются INTEGER. Сравнение аномалии делит сумму на 7 до умножения на 3, предотвращая SQLite integer overflow и уход во float.