Skip to main content

Получение данных для прогнозов

Мы получаем исходные данные из базы данных 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