如何在 SQLAlchemy/Postgres 中限制每个 `group_by` 的 N 个结果?

努贝拉

这是我的 SQLAlchemy 查询代码

medium_contact_id_subq = (g.session.query(distinct(func.unnest(FUContact.medium_contact_id_lis))).filter(FUContact._id.in_(contact_id_lis))).subquery()
q = (g.session.query(FUMessage).
         filter(FUMessage.fu_medium_contact_id.in_(medium_contact_id_subq))
         .order_by(desc(FUMessage.timestamp_utc))
         )

我想限制FUMessage分组为medium_contact_idN 个结果。


作为一种解决方法,这是我当前丑陋且未优化的代码:

    medium_contact_id_lis = (g.session.query(distinct(func.unnest(FUContact.medium_contact_id_lis))).filter(FUContact._id.in_(contact_id_lis))).all()
    q = None
    for medium_contact_id_tup in medium_contact_id_lis:
        medium_contact_id = medium_contact_id_tup[0]
        if q is None:
            q = (g.session.query(FUMessage)
                 .filter(FUMessage.fu_medium_contact_id == medium_contact_id)
                 .limit(MESSAGE_LIMIT)
                 )
        else:
            subq = (g.session.query(FUMessage)
                 .filter(FUMessage.fu_medium_contact_id == medium_contact_id)
                 .limit(MESSAGE_LIMIT)
                 )
            q = q.union(subq)
    q = q.order_by(desc(FUMessage.timestamp_utc))
伊利亚·埃维莱拉

获取每组N行的一种方法是使用窗口函数,例如rank()row_number()在具有所需分组和顺序的子选择中,然后在封闭的选择中过滤。对于N = 1,您可以在 Postgresql 中使用DISTINCT ON ... ORDER BY组合。

使用函数元素的over()方法来生成窗口表达式,将其应用于 SQLAlchemy 很简单

medium_contact_id_subq = g.session.query(
        func.unnest(FUContact.medium_contact_id_lis).distinct()).\
    filter(FUContact._id.in_(contact_id_lis)).\
    subquery()

# Perform required filtering in the subquery. Choose a suitable ordering,
# or you'll get indeterminate results.
subq = g.session.query(
        FUMessage,
        func.row_number().over(
            partition_by=FUMessage.fu_medium_contact_id,
            order_by=FUMessage.timestamp_utc).label('n')).\
    filter(FUMessage.fu_medium_contact_id.in_(medium_contact_id_subq)).\
    subquery()

fumessage_alias = aliased(FUMessage, subq)

# row_number() counts up from 1, so include rows with a row num
# less than or equal to limit
q = g.session.query(fumessage_alias).\
    filter(subq.c.n <= MESSAGE_LIMIT)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

dplyr:如何对group_by的结果应用do()?

来自分类Dev

如何在额外列中的一个 sql 查询中组合 2 个 group by 查询的结果?

来自分类Dev

在R中,dplyr中的group_by如何工作?

来自分类Dev

R 汇总 group_by 结果

来自分类Dev

如何在管道中更早编写尊重group_by()的tidyverse友好函数?

来自分类Dev

如何在R中的group_by之后处理特殊行

来自分类Dev

如何在 mongoDB 中为 db.currentOp() json 数组做 group_by

来自分类Dev

如何在 Rails find_by_sql 和 group_by 中传递变量

来自分类Dev

R中的group_by

来自分类Dev

如何在文件中grep -n并将两个结果之间的行保存到文件中

来自分类Dev

如何在迭代器中屏蔽除第n个元素之外的每个元素?

来自分类Dev

如何在CSS中的每个第n个元素之后选择一组元素?

来自分类Dev

如何在嵌套查询中为每个查询获取n个文档?

来自分类Dev

如何在每个第n个索引处将字符串放入列表中?

来自分类Dev

IPTABLES:如何在一个时间单位内限制所选网络中的每个ip访问端口25

来自分类Dev

我如何在 R 中使用 group_by 将所有值与下一个值进行比较

来自分类Dev

不使用group_by时如何按组显示结果。股票的加权平均值

来自分类Dev

如何将 Google NewsApi 限制从每个请求 100 个结果提高?我怎样才能得到更多的结果?

来自分类Dev

使用dplyr的group_by函数为每个组创建一个列表元素

来自分类Dev

使用dplyr的group_by函数为每个组创建一个列表元素

来自分类Dev

如何“降序”订购group_by?

来自分类Dev

如何创建嵌套的group_by?

来自分类Dev

如何在OrientDB中合并两个查询的结果

来自分类Dev

如何在函数R中输出两个结果

来自分类Dev

如何在 PHP 中每页显示 1 个结果

来自分类Dev

如何通过group_by中的group-number编号/标记数据表?

来自分类Dev

如何在GROUP BY Druid返回的结果中执行SELECT?

来自分类Dev

如何在GROUP BY Druid返回的结果中执行SELECT?

来自分类Dev

如何添加group_by以修复postgresql group_by错误

Related 相关文章

  1. 1

    dplyr:如何对group_by的结果应用do()?

  2. 2

    如何在额外列中的一个 sql 查询中组合 2 个 group by 查询的结果?

  3. 3

    在R中,dplyr中的group_by如何工作?

  4. 4

    R 汇总 group_by 结果

  5. 5

    如何在管道中更早编写尊重group_by()的tidyverse友好函数?

  6. 6

    如何在R中的group_by之后处理特殊行

  7. 7

    如何在 mongoDB 中为 db.currentOp() json 数组做 group_by

  8. 8

    如何在 Rails find_by_sql 和 group_by 中传递变量

  9. 9

    R中的group_by

  10. 10

    如何在文件中grep -n并将两个结果之间的行保存到文件中

  11. 11

    如何在迭代器中屏蔽除第n个元素之外的每个元素?

  12. 12

    如何在CSS中的每个第n个元素之后选择一组元素?

  13. 13

    如何在嵌套查询中为每个查询获取n个文档?

  14. 14

    如何在每个第n个索引处将字符串放入列表中?

  15. 15

    IPTABLES:如何在一个时间单位内限制所选网络中的每个ip访问端口25

  16. 16

    我如何在 R 中使用 group_by 将所有值与下一个值进行比较

  17. 17

    不使用group_by时如何按组显示结果。股票的加权平均值

  18. 18

    如何将 Google NewsApi 限制从每个请求 100 个结果提高?我怎样才能得到更多的结果?

  19. 19

    使用dplyr的group_by函数为每个组创建一个列表元素

  20. 20

    使用dplyr的group_by函数为每个组创建一个列表元素

  21. 21

    如何“降序”订购group_by?

  22. 22

    如何创建嵌套的group_by?

  23. 23

    如何在OrientDB中合并两个查询的结果

  24. 24

    如何在函数R中输出两个结果

  25. 25

    如何在 PHP 中每页显示 1 个结果

  26. 26

    如何通过group_by中的group-number编号/标记数据表?

  27. 27

    如何在GROUP BY Druid返回的结果中执行SELECT?

  28. 28

    如何在GROUP BY Druid返回的结果中执行SELECT?

  29. 29

    如何添加group_by以修复postgresql group_by错误

热门标签

归档