@Radist_101

Как написать запрос на sqlalchemy с фильтром по количеству покупок?

Здравствуйте, есть три таблицы User, Place, Sales:
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)

class Place(db.Model):
    id = db.Column(db.Integer(), primary_key=True)
    sales = db.relationship('Sales', backref='place', lazy='dynamic')

    def regular_clients(self, time_start, time_end):
        pass

class Sales(db.Model):
    id = db.Column(db.Integer(), primary_key=True)
    place_id = db.Column(db.Integer, db.ForeignKey('place.id'))    
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    buyer = db.relationship("User", foreign_keys=[user_id])
    timestamp = db.Column(db.DateTime(timezone=False),default=datetime.utcnow)
    sum = db.Column(db.Integer, nullable=False)

Необходимо посчитать постоянных клиентов на точке Place за определенный промежуток времени, клиент считается "постоянным", если, например, он сделал 5 покупок за временной промежуток.

В классе Place начал описывать метод:
def regular_clients(self, time_start, time_end):
    query = db.session.query(User).join(Sales.user_id).\
        filter(Sales.place_id == self.id,
               Sales.timestamp >= date_start, Sales.timestamp <= date_end)

Но как добавить фильтр по количеству покупок, помогите плиз, написать запрос.
  • Вопрос задан
  • 334 просмотра
Решения вопроса 1
Это должно быть вот так. Нужно использовать GROUP BY.

def regular_clients(self, time_start, time_end):
    return db.session.query(User).join(Sales).filter(self.id==1, Sales.timestamp >= time_start, Sales.timestamp <= time_end).group_by(User.id).having(func.count(Sales.id) >= 5).all()
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
skipirich
@skipirich
проходил мимо
По моему ни как. Фильтр применяется к полю в таблице а не к количеству выбираемых записей. Поправьте если не прав.
Ответ написан
Комментировать
@Radist_101 Автор вопроса
мне подсказали, что с помощью func.count() можно посчитать количество уникальных покупателей, но пока не получается сформировать запрос
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы