我在python中使用sqlalchemy和postgres数据库。
我想从两个表执行联合查询,我希望在其中选择具有公共键的最大列的行。我无法弄清楚如何在sqlalchemy中完成这项工作。
假设我有一个表users
的表对象和另一个表orders
的表对象。
我知道如何定义这个联合查询:
union_query = union(
select([users.c.email, users.c.timestamp]),
select([orders.c.email, orders.c.timestamp])
)
但是,在某些情况下,可能会有一些email
列具有不同的timestamp
值。在这种情况下,我希望结果显示任何给定timestamp
的最大email
。
例如,假设users
表包含此数据:
email | timestamp
--------| ---------
a@b.com | 00:00:00
c@d.com | 02:03:04
e@f.com | 10:10:10
...并假设orders
表包含此数据:
email | timestamp
--------| ---------
a@b.com | 12:12:12
c@d.com | 01:01:01
q@r.com | 09:09:09
我希望基于联合的查询的结果如下......
email | timestamp
--------| ---------
a@b.com | 12:12:12
c@d.com | 02:03:04
e@f.com | 10:10:10
q@r.com | 09:09:09
我无法提供group_by()
,func.max()
和其他sqlalchemy函数的正确组合,以便与union_query
一起使用以生成此查询。< / p>
感谢您提供任何帮助。
答案 0 :(得分:1)
我想我想出了答案。需要别名,union_query
需要用作子查询。
你们中有没有人看到这个问题,或者更有效的方法吗?
union_query = union(
select([users.c.email, users.c.timestamp]),
select([orders.c.email, orders.c.timestamp])
).alias('uq_alias')
query = select(
[union_query.c.email, func.max(union_query.c.timestamp)]
).group_by(union_query.c.email)
...然后只需执行query
。