相关疑难解决方法(0)

PostgreSQL中的分组限制:显示每组的前N行?

我需要为每个组取前N行,按自定义列排序.

鉴于下表:

db=# SELECT * FROM xxx;
 id | section_id | name
----+------------+------
  1 |          1 | A
  2 |          1 | B
  3 |          1 | C
  4 |          1 | D
  5 |          2 | E
  6 |          2 | F
  7 |          3 | G
  8 |          2 | H
(8 rows)
Run Code Online (Sandbox Code Playgroud)

我需要每个section_id的前两行(按名称排序),即类似于的结果:

 id | section_id | name
----+------------+------
  1 |          1 | A
  2 |          1 | B
  5 |          2 | …
Run Code Online (Sandbox Code Playgroud)

sql postgresql

157
推荐指数
4
解决办法
7万
查看次数

如何在 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))
         )
Run Code Online (Sandbox Code Playgroud)

我想限制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))
Run Code Online (Sandbox Code Playgroud)

python postgresql sqlalchemy greatest-n-per-group

2
推荐指数
1
解决办法
2757
查看次数