不同日期的SQL/SQLAlchemy计数



关于如何在SQL中使用视图或存储过程实现这一点的问题是一样的?

我有一个由4列简化的销售表,即id、product_id、sale_date和quantity。我想建立一个请求,返回:1.对于每个product_id,一行中按日期列出的总销售额2.在同一行,每个id为7、15、30天的总销售额

目前,我使用多个WITH视图,每列一个:

days7=session.query(Sales.product_id,func.sum(Sales.quantity).label('count')).
filter(Sales.sale_date > now() - timedelta(days=7)).
group_by(Sales.product_id).cte('days7')
...
req=session.query(Sales.product_id,days7.c.count.label('days7'),
days15.c.count.label('days15'),
days30.c.count.label('days30')).
outerjoin(days7,days7.c.product_id==Sales.product_id).
outerjoin(days15,days15.c.product_id==Sales.product_id).
outerjoin(days30,days30.c.product_id==Sales.product_id).
all()

它运行得很好,但我不确定这是否是最好的方法。此外,如果我想添加前30天(或360天(的每个日期的计数,那就太疯狂了。这个想法可能是使用一个简单的for循环:

viewSumByDay=[]
for day in range(180):
date=now()-timedelta(days=day)
viewSumByDay.append(session.query(...).cte(str(date.date())))

这可以创建视图。尽管对于左边的联接,req=req.outerjoin(viewSumByDay[day],...)应该也可以,但我现在还不知道如何使用循环将列添加到主查询中。

你看到另一个好的解决方案了吗?

非常感谢你的帮助!

好的,对不起,文档中描述了一个简单的req=req.add_column(...)

然而,如果有更漂亮的方式,我想知道它。

最新更新