Peewee / SQLite查询7天滚动平均值

时间:2017-02-17 21:19:31

标签: python sqlite peewee

我有一份每日会议表和每种产品的销售单位

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 个答案:

答案 0 :(得分: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)