postgres / sqlalchemy / python:联合查询中的group-by / max?

时间:2017-05-25 17:12:05

标签: postgresql group-by sqlalchemy max union

我在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>

感谢您提供任何帮助。

1 个答案:

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