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