2017-02-17 16 views
1

У меня есть таблица ежедневных сессий и проданные единиц для каждого продуктаPeewee/SQLite Запрос на 7 день скользящего среднего

ProductId (char) | Date | Sessions | UnitsSold 
sku01 | 2017-02-01 | 21 | 4 
sku01 | 2017-02-02 | 14 | 3 
sku01 | 2017-02-03 | 13 | 3 
sku01 | 2017-02-06 | 14 | 2 
sku01 | 2017-02-07 | 5 | 1 
sku01 | 2017-02-09 | 2 | 0 
sku02 | 2017-02-02 | 16 | 10 
sku02 | 2017-02-03 | 16 | 10 
sku02 | 2017-02-14 | 30 | 23 
... 

Я пытаюсь создать отчет для каждого продукта, который дает последние 7 дней прокатки в среднем на каждый день для сессий и единиц проданных ценностей

Так, например, выход для sku01 будет:

Date | SessionsRollingAvg | UnitsSoldRollingAvg 
2017-02-01 | sra1 | usra1 
2017-02-02 | sra2 | usra2 
... 

где:

sra1 = (sum of Sessions 2017-02-01 to 2017-02-07 for sku01)/7 
usra1 = (sum of UnitsSold 2017-02-01 to 2017-02-07 for sku01)/7 
sra2 = (sum of Sessions 2017-02-02 to 2017-02-08 for sku01)/7 
usra2 = (sum of UnitsSold 2017-02-02 to 2017-02-08 for sku01)/7 

До сих пор я нашел this article, в котором упоминается несколько способов сделать это с помощью Postgres, MySQL. Но как я могу это сделать с Peewee ORM?

ответ

1

Запустите свой запрос из своего класса продуктов, после чего вы можете указать условие соединения, чтобы выбрать нужные вам сеансы. См. Этот ответ Is it possible to make sql join on several fields using peewee python ORM?

Затем вы можете использовать fn и group_by для создания среднего.

Что-то вроде этого более или менее совпадений запросы, описанные в вашей статье:

from peewee import fn 

cond = (
    (MySessions.product_id == MyProduct.id) & 
    (MySessions.date.between(7daysago, now)) 
) 

query = (MyProduct 
     .select(MyProduct, fn.avg(MyTable.Sessions).alias('session_avg') 
     .join(MySessions, on=cond) 
     .group_by(MyProduct)