SQLAlchemy:如何按两个字段分组并按日期过滤
Posted
技术标签:
【中文标题】SQLAlchemy:如何按两个字段分组并按日期过滤【英文标题】:SQLAlchemy: How to group by two fields and filter by date 【发布时间】:2010-06-15 10:52:54 【问题描述】:所以我有一个包含日期戳和两个字段的表,我想确保它们在上个月是唯一的。
table.id
table.datestamp
table.field1
table.field2
上个月不应该有相同field1+2复合值的重复记录。
我脑海中的步骤是:
-
按两个字段分组
回顾上个月的数据,确保没有出现这种独特的分组。
我已经做到了这一点,但我认为这行不通:
result = session.query(table).group_by(\
table.field1,
table.field2,
func.month(table.timestamp))
但我不确定如何在 sqlalchemy 中执行此操作。有人可以给我建议吗?
非常感谢!
【问题讨论】:
【参考方案1】:以下应该为您指明正确的方向,另请参阅内联 cmets:
qry = (session.query(
table.c.field1,
table.c.field2,
# #strftime* for year-month works on sqlite;
# @todo: find proper function for mysql (as in the question)
# Also it is not clear if only MONTH part is enough, so that
# May-2001 and May-2009 can be joined, or YEAR-MONTH must be used
func.strftime('%Y-%m', table.c.datestamp),
func.count(),
)
# optionally check only last 2 month data (could have partial months)
.filter(table.c.datestamp < datetime.date.today() - datetime.timedelta(60))
.group_by(
table.c.field1,
table.c.field2,
func.strftime('%Y-%m', table.c.datestamp),
)
# comment this line out to see all the groups
.having(func.count()>1)
)
【讨论】:
非常感谢van,但是您的解决方案在我的sqlalchemy知识中戳了个洞,表对象的'c'属性有什么意义? 如果你有一个table
对象,那么c
是columns
的快捷方式。请参阅 SQL 表达式语言教程:sqlalchemy.org/docs/…
别担心,我应该用谷歌搜索我的问题,这种情况经常发生!
然而,我意识到我们并没有使用原生 mysql 时间戳,实际上,我们使用 int(time.time()) 来存储时间,以与其他系统兼容。我将修改我的问题以包含此内容,也许我可以在最后 2,592,000 秒内仅添加时间戳检查? (30 天)
@van:我爱你。它是如此简单和干净,我什至不会想到...以上是关于SQLAlchemy:如何按两个字段分组并按日期过滤的主要内容,如果未能解决你的问题,请参考以下文章
Python Pandas:按日期分组,并按时间戳访问每个组