при использовании «group_by» в запросе выберите элемент из каждой группы

#python #sql #sqlalchemy

#python #sql #sqlalchemy

Вопрос:

Мне было интересно, как извлечь произвольный элемент из класса при запросе с помощью «group by». Например:

 class Post(Base):
    id = Column(Integer, primary_key=True)
    created = Column(DateTime)
    comments = Column(Integer)
    creator = Column(Integer, ForeignKey('user.id'))
    anonymous = Column(Boolean)

class User(Base):
    id = Column(Integer, primary_key=True)
 

Как мне создать запрос, который выводит:

 creator | total number of comments made on the creator's post | the time of the creator's last post

creator | total number of comments made on the creator's post | if any of the posts are anonymous
 

Базовый запрос будет:

 session = DBSession()
commsum = session.query(Post.creator, func.sum(Post.comments).label('totalcomments')).
    group_by(Post.creator).subquery()
return session.query(User, commsum.c.totalcomments).
    join(commsum, commsum.c.creator == User.id).all()
 

Что, если бы я хотел вернуть 1) самую последнюю дату всех строк в каждой group_by (Post.creator) или 2) если какая-либо из строк имела anonymous == True.

Комментарии:

1. Что у вас есть на данный момент? Что вы пробовали? (Пожалуйста, обновите свой вопрос с помощью этой информации.)

2. еще ничего не пробовал, занят другими задачами. я просто искал решение, но не смог его найти.

Ответ №1:

В SQL вы должны быть в состоянии сделать что-то вроде:

 SELECT Post.creator, 
       sum(Post.comments) total_comments
       max(Post.Created) latest_post
       max(Post.anonymous) any_anonymous
FROM Post
GROUP BY Post.creator