1

所以可以说我有一些这样定义的简单类

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 循环和缺乏查询让我认为这是一个不太理想的解决方案。

4

1 回答 1

0

如果您使用的是 PostgreSQL,您可以使用 DISTINCT ON (...),它占用每个组中的第一行。在蟒蛇中:

session.query(Person)
.join(Address, Pet)
.distinct(Address.state, Pet.species)
.order_by(Address.state, Pet.species, Person.birthday)

这将产生类似于:

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
于 2016-07-28T08:18:25.983 回答