python - 在 SqlAlchemy 上使用 distinct on (Postgres) 的正确方法是什么?
问题描述
我想获取具有 max(timestamp) 和按名称分组的表的所有列。
到目前为止我尝试的是: normal_query =“从表中选择 max(timestamp) 作为时间”
event_list = normal_query \
.distinct(Table.name)\
.filter_by(**filter_by_query) \
.filter(*queries) \
.group_by(*group_by_fields) \
.order_by('').all()
我得到的查询:
SELECT DISTINCT ON (schema.table.name) , max(timestamp)....
该查询基本上返回带有名称和时间戳的两列。
而我想要的查询:
SELECT DISTINCT ON (schema.table.name) * from table order by ....
它返回该表中的所有列。这是预期的行为,我能够得到所有的列,我怎么能在 python 中正确地得到这个语句?。基本上没有星号。有人可以帮助我吗?
解决方案
您似乎想要的是DISTINCT ON ... ORDER BY
Postgresql 中用于选择每个组的最大 n 个结果(N = 1)的习语。因此,而不是仅仅分组和聚合
event_list = Table.query.\
distinct(Table.name).\
filter_by(**filter_by_query).\
filter(*queries).\
order_by(Table.name, Table.timestamp.desc()).\
all()
这将最终选择按名称“分组”的行,具有最大的时间戳值。
大多数时候,您不想在应用程序代码中使用星号,除非您正在执行手动临时查询。星号基本上是“FROM
表/关系中的所有列”,如果您添加列、重新排序等,它可能会在以后打破您的假设。
如果您想根据最终结果中的时间戳对结果行进行排序,您可以使用例如Query.from_self()
将查询转换为子查询,并在封闭查询中排序:
event_list = Table.query.\
distinct(Table.name).\
filter_by(**filter_by_query).\
filter(*queries).\
order_by(Table.name, Table.timestamp.desc()).\
from_self().\
order_by(Table.timestamp.desc()).\
all()
推荐阅读
- excel - VBA - 使用单元格值名称更改目录文件夹
- javascript - MVC4 Razor Modal 未显示使用 onclick 事件处理程序传递给自定义 Javascript 函数的值
- c++ - 将接受回调的函数调用转换为协程
- google-apps-script - GCP App Script API Auth 仅对两个用户不起作用(代码:403,“PERMISSION_DENIED”)
- azure-data-factory - 有没有办法使用 Azure Data Lake 在目录中查找最旧的文件?
- microsoft-graph-api - 如何使用 ms graph win 读取 ChannelMessages。使用当前 userPrincipalName 的服务应用程序(在应用程序权限中)
- javascript - 为什么 ES6 模块导入表达式不适用于 assets 文件夹中带有一些路径参数的 json 文件?
- elasticsearch - 对“search_as_you_type”ngram 子字段感到困惑
- kubernetes - Google Cloud Composer 从 Google Container Registry 中提取过时的镜像
- javascript - Immer - 在生产中使用异步函数获取错误