SQLAlchemy получает не более N результатов, где в каждой категории меньше M - PullRequest
0 голосов
/ 30 июня 2019

У меня есть три таблицы A, B, C, где A s имеют B s, а B s имеют C s, так же, как в школе есть классы (математика, литература) а на занятиях есть ученики. Одни и те же имена B считаются одинаковыми, независимо от того, к какому A они принадлежат, так же, как и C s для тех же B.

Я бы хотел запросить подмножество A с (простое filter), чтобы получить максимум N B с, каждый из которых имеет не более M C с.

Я читал о нескольких способах получения максимальных N для каждой категории, но не смог даже заставить это (см. Ниже) работать с моим SQLite ... запросом, который никогда не заканчивается.

    subq = sess.query(
            C,
            func.row_number().over(
                partition_by=B.name,
                order_by=C.grade).label('n')).\
        filter(~A.name.startswith('something'), B.size==2, C.grade < threshold).\
        subquery()

    q_alias = aliased(Val, subq)
    q = sess.query(q_alias).filter(subq.c.n <= M)

Это вообще выполнимо, или я должен просто запросить все и выполнить цикл в Python, пока не достигну N?

EDIT:

class A(Base):
    __tablename__ = 'a_objs'

    id      = Column(Integer, primary_key=True)
    name    = Column(String(128))

    b_list = relationship('B', cascade='all, delete-orphan', lazy='dynamic', back_populates='a')

class B(Base):
    __tablename__ = 'b_objs'

    id      = Column(Integer, primary_key=True)
    name    = Column(String(128))

    a_id = Column(Integer, ForeignKey('a_objs.id'))
    a = relationship('A', back_populates='b_list')

    c_list = relationship('C', cascade='all, delete-orphan', order_by='asc(C.grade)', back_populates='b')


class C(Base):
    __tablename__ = 'c_objs'

    id              = Column(Integer, primary_key=True)
    grade           = Column(Float)
    name            = Column(String(128))

    b_id = Column(Integer, ForeignKey('b_objs.id'))
    b = relationship('B', back_populates='c_list')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...