Задать вопрос
@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)

Но как добавить фильтр по количеству покупок, помогите плиз, написать запрос.
  • Вопрос задан
  • 353 просмотра
Подписаться 3 Оценить Комментировать
Решения вопроса 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() можно посчитать количество уникальных покупателей, но пока не получается сформировать запрос
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
SpectrumData Екатеринбург
от 200 000 до 300 000 ₽
Greenway Global Новосибирск
от 150 000 ₽
Akronix Санкт-Петербург
от 150 000 до 200 000 ₽
20 янв. 2025, в 00:38
1500 руб./за проект
19 янв. 2025, в 21:32
19000 руб./за проект
19 янв. 2025, в 19:29
3000 руб./за проект