Sqlalchemy查询和过滤

Sqlalchemy查询和过滤,sqlalchemy,Sqlalchemy,假设我定义了一些简单的类 class Person birthday class Address state 我想要每个州最年长的人,我想我能得到 有点像 db.session.query(Address).order_by(Person.birthday.desc()).first() 但是现在我添加了另一个类 class pet species 我想找出每个州每种物种中最年长的人 所以从下面的 john - MI - dog - 50 alex - MI -

假设我定义了一些简单的类

class Person
    birthday

class Address
    state
我想要每个州最年长的人,我想我能得到 有点像

db.session.query(Address).order_by(Person.birthday.desc()).first()
但是现在我添加了另一个类

class pet
    species
我想找出每个州每种物种中最年长的人 所以从下面的

john - MI - dog - 50
alex - MI - dog - 51
joe  - MI - cat - 10
tina - FL - cat - 20
我只想

alex, joe, tina
但不是约翰,因为他不是最大的

我怎样才能建立一个查询来进行这项工作呢。我应该学习什么主题 关于

这是我迄今为止最好的尝试。此代码特定于我的数据库:

def most_recent_completed_uss(user):
    lids = []
    for o in user.organizations:
        for sh in o.survey_headers:
            for ss in sh.survey_sections:
                l = datetime.datetime(1,1,1)
                lid = None
                for uss in ss.user_survey_sections:
                    if o.id == uss.organization.id:
                        if l == datetime.datetime(1,1,1):
                            lid = uss.id
                        if (uss.completed_date and uss.completed_date >= l):
                            l = uss.completed_date
                            lid = uss.id
                lids.append(lid)
    return lids

当然,4嵌套for循环和缺少查询使我认为这是一个不太理想的解决方案。

如果使用PostgreSQL,可以使用DISTINCT ON(…),它占据每个组的第一行。在python中:

session.query(个人)
.加入(地址、宠物)
.distinct(地址、州、宠物种类)
.订购人(地址、州、宠物、品种、人、生日)
这将产生类似于:


从这里开始:@TomDignan,注意更具体一点。
SELECT DISTINCT ON(address.state, pet.species) person.*
FROM person
JOIN address ON person.address_id = address.id
JOIN pet ON pet.owner_id = person.id
ORDER BY address.state, pet.species, person.birthday