Работа с данными для прогнозов
Мы получаем исходные данные из базы данных MS SQL с помощью SQL-запросов.
Получение данных о заказах
Для получения данных о заказах составляется отчет по заказам с фильтрацией по дате заказа и наличию даты поставки.
Источником получения данных служит таблица Report.[report_zakaz_tbl]
Запрос извлекает данные о заказах из таблицы отчетов за указанный период времени. Запрос фокусируется на заказах, где дата заказа находится в заданном диапазоне, и дата поставки не является NULL. Дополнительно вычисляется поле с датой поставки, увеличенной на 15 минут.
Текст запроса
Ниже представлен запрос для получения информации о заказах:
SELECT
id_order as id,
ShopNo as shopno,
order_type,
gettype,
date_order,
date_supply,
date_supply_untill,
date_posted,
date_collect_start,
date_collected,
date_delivery_start,
date_delivered,
sum_paid,
sum_paid_coupon,
count_pos,
latitude,
longitude,
client_type,
order_weight,
delivery_hottime,
collecting_await_dur,
collecting_dur,
delivery_await_dur,
delivery_dur,
completed_agg,
distance,
DATEADD(Minute, 15, date_supply) as date_supply_vv
FROM Report.[report_zakaz_tbl] rzt (NOLOCK)
WHERE date_order BETWEEN '{{payload.from}}' AND '{{payload.to}}'
AND date_supply IS NOT NULL
Поля запроса
Запрос возвращает 27 полей. Ниже приведена таблица с описаниями:
Поле SELECT | Исходное поле | Тип данных |
id | id_order | INT |
shopno | ShopNo | INT |
order_type | order_type | TinyInt |
gettype | gettype | TinyInt |
date_order | date_order | DateTime |
date_supply | date_supply | DateTime |
date_supply_untill | date_supply_untill | DateTime |
date_posted | date_posted | DateTime |
date_collect_start | date_collect_start | DateTime |
date_collected | date_collected | DateTime |
date_delivery_start | date_delivery_start | DateTime |
date_delivered | date_delivered | DateTime |
sum_paid | sum_paid | FLOAT |
sum_paid_coupon | sum_paid_coupon | FLOAT |
count_pos | count_pos | SmallInt |
latitude | latitude | Decimal(19,16) |
longitude | longitude | Decimal(19,16) |
client_type | client_type | NVarChar(100) COLLATE Cyrillic_General_CI_AS |
order_weight | order_weight | Decimal(15,3) |
delivery_hottime | delivery_hottime | DateTime |
collecting_await_dur | collecting_await_dur | INT |
collecting_dur | collecting_dur | INT |
delivery_await_dur | delivery_await_dur | INT |
delivery_dur | delivery_dur | INT |
completed_agg | completed_agg | INT |
distance | distance | Real |
date_supply_vv | date_supply | (вычисляемое) |
Фильтры запроса
В запросе присутствуют 2 фильтра:
- date_order BETWEEN '{{payload.from}}' AND '{{payload.to}}': Фильтр по дате заказа. Включает заказы, где дата заказа >= '{{payload.from}}' и <= '{{payload.to}}'.
- date_supply IS NOT NULL: Исключает заказы без указанной даты поставки.
Вычисляемые поля
В запросе есть вычисляемое поле:
- DATEADD(Minute, 15, date_supply) as date_supply_vv: Функция SQL Server для добавления 15 минут к полю date_supply.
Получение данных о геозонах
Для получения данных о геозонах составляется отчет по зонам с фильтрацией по магазинам.
Источником получения данных служит таблицы [GeoReports].[Analytics].[EffectiveZonesOnlineServices] и [Geo].[geo].[tt]
Запрос объединяет данные из двух таблиц для получения информации о зонах, услугах и временных интервалах.
Текст запроса
Ниже представлен запрос для получения информации о заказах:
SELECT
tt.N AS id_tt,
id_online_service,
id_poly,
date_add,
geo,
payway,
time_start,
time_end
FROM [GeoReports].[Analytics].[EffectiveZonesOnlineServices] (NOLOCK) z
JOIN [Geo].[geo].[tt] tt ON tt.id_TT = z.id_tt
WHERE tt.name_TT LIKE '%ДС[_]%
Поля запроса
Запрос возвращает 8 полей. Ниже приведена таблица с описаниями:
Поле SELECT | Исходное поле | Тип данных |
id_tt | tt.N | |
id_online_service |
id_online_service |
|
id_poly |
id_poly |
|
date_add |
date_add |
|
geo |
geo |
|
payway |
payway |
|
time_start |
time_start |
|
time_end |
time_end |
Фильтры запроса
В запросе присутствуют 2 фильтра:
- INNER JOIN на tt.id_TT = z.id_tt. Это объединяет записи только если есть совпадение по идентификатору точки (id_tt). Если в z нет соответствующей записи в tt, она не попадет в результат.
- WHERE tt.name_TT like '%ДС[_]%': Фильтр по имени точки (магазина) в таблице tt.
Таблицы хранения полученных данных
Исходные данные, используемые для построения прогноза, размещены в следующих таблицах:
- vv_orders_ts — гипертаблица с информацией о заказах. Включает поля, заполняемые на основе исходной таблицы Report.[report_zakaz_tbl], а также ряд дополнительных полей.
- test_vv_points — географические зоны, связанные с торговыми точками (ТТ).
- weather — данные о погоде, загруженные из сервиса https://api.met.no.
- weather_stations — погодные станции с сервиса rp5.ru. Применялись для загрузки исторических метеоданных.
- calendar — табель-календарь, заполняемый посредством системы репликации.
Кроме того, на базе этих таблиц создаются материализованные представления:
- vv_orders_ts_hash_hourly — заказы в географической зоне за определенный час, исключая заказы с типом gettype = 6 (доставка через Яндекс).
- vv_lines_ts_hash_hourly — количество собранных строк для географической зоны за конкретный час.
Ниже приведено описание этих таблиц и представлений, в которым перечислены поля использующиеся для составления прогноза.
vv_orders_ts
Поле | Тип данных |
id | int4 |
shopno | int4 |
order_type | int4 |
gettype | int4 |
date_order | timestamp |
date_supply | timestamp |
date_supply_untill | timestamp |
date_posted | timestamp |
date_collect_start | timestamp |
date_collected | timestamp |
date_delivery_start | timestamp |
date_delivered | timestamp |
sum_paid | float8 |
sum_paid_coupon | float8 |
count_pos | int2 |
latitude | numeric(19, 16) |
longitude | numeric(19, 16) |
client_type | varchar(100) |
order_weight | numeric(15, 3) |
delivery_hottime | timestamp |
collecting_await_dur | int4 |
collecting_dur | int4 |
delivery_await_dur | int4 |
delivery_dur | int4 |
completed_agg | int4 |
distance | float4 |
date_supply_vv | timestamp |
details | jsonb |
tt_id | int4 |
geohash | varchar(20) |
test_vv_points
Поле | Тип данных | Описание |
geohash | varchar(20) | Геохэш области |
tt_id | numeric | ИД иорговой точки |
coeff | int4 |
Вероятность того, что заказ в данной области попадет в данную ТТ. Определяется на основе статистики заказов за предыдущие 3 дня
|
weather
Поле | Тип данных | Описание |
weather_station_id | int4 | ИД погодной станции |
date | timestamp | Время |
temperature | numeric(3, 1) |
Температура |
humidity | int4 |
Влажность |
wind_speed | int4 |
Скорость ветра |
weather_stations
Поле | Тип данных | Описание |
id | serial4 | ИД погодной станции |
active | bool | Признак активности |
calendar
Поле | Тип данных | Описание |
id | serial4 | ИД |
date | date | Дата |
type | int4 | Тип (2 - суббота, 3 - воскресенье, 4 - предпраздничный день, 5 - праздник) |
vv_orders_ts_hash_hourly
Для составления представления формируется запрос который формирует представление для хранения агрегированных данных о количестве заказов, сгруппированных по геохешу и часовым интервалам. Исключаются заказы с типом получения gettype = 6. Представление обновляется автоматически.
Источником получения данных служит таблица vv_orders_ts.
Текст запроса:
CREATE MATERIALIZED VIEW vv_orders_ts_hash_hourly
WITH (timescaledb.continuous) AS
SELECT
geohash,
time_bucket('1 hour', ts.date_supply_vv) AS bucket,
COUNT(*) AS cnt
FROM vv_orders_ts ts
WHERE ts.gettype != 6
GROUP BY geohash, bucket;
Поля запроса:
Поле | Тип данных | Описание |
geohash | varchar(20) | |
bucket | timestamp | |
cnt | int8 |
vv_lines_ts_hash_hourly
Для составления представления формируется запрос который формирует представление для хранения агрегированных данных о суммарном количестве позиций (строк) в заказах, сгруппированных по геохешу и часовым интервалам.
Источником получения данных служит таблица vv_orders_ts.
Текст запроса:
CREATE MATERIALIZED VIEW vv_lines_ts_hash_hourly
WITH (timescaledb.continuous) AS
SELECT
geohash,
time_bucket('1 hour', ts.date_supply_vv) AS bucket,
SUM(ts.count_pos) AS cnt
FROM vv_orders_ts ts
GROUP BY geohash, bucket;
Поля запроса:
Поле | Тип данных | Описание |
geohash | varchar(20) | |
bucket | timestamp | |
cnt | int8 |