У меня есть три таблицы 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')