SQLAlchemy : obtenir la valeur maximale des valeurs groupées
P粉738346380
P粉738346380 2023-09-01 12:07:40
0
1
469
<p>J'ai ce tableau dans mon application Flask : </p> <pre class="brush:php;toolbar:false;">événements de classe (db.Model) : id = db.Column(db.Integer, Primary_key=True, autoincrement=True) timestamp_event = db.Column(db.DateTime, nullable=False)</pre> <p>J'ai besoin d'obtenir le jour avec le plus d'enregistrements, y compris la valeur et la date elle-même dans un format imprimable (par exemple j/m/a). J'ai essayé le code suivant : </p> <pre class="brush:php;toolbar:false;">daily_max = db.func.max(db.session.query(db.func.count(Events.id), db.func.date_format(Events.timestamp_event,'%d/%m/%y')) .group_by(db.func.date_format(Events.timestamp_event,'%Y%M%D')))</pre> <p>Ensuite, nous espérons que daily_max[0] a une valeur et daily_max[1] n'a pas la date hh:mm:ss. </p> <p>Lorsque j'imprime daily_max après la requête, la valeur est : </p> <pre class="brush:php;toolbar:false;">daily_max = max((SELECT count(events.id) AS count_1, date_format(events.timestamp_event, :date_format_2) AS date_format_1 FROM événements GROUP BY date_format(events.timestamp_event, :date_format_3)))</pre> <p> Ceci est un échantillon des données. La réponse (la valeur de <code>daily_max</code>) doit être <strong>(3, "21/01/2022")</strong> : </p> <pre class="brush:php;toolbar:false;">id timestamp_event ---- --------------- 1 2022-01-15 12:34 2 2022-01-21 01:23 3 2022-01-21 05:33 4 2022-01-21 11:11 5 2022-01-23 00:01 6 2022-01-23 23:29</pré> <p>Des indices sur ce que je fais de mal ? Je ne trouve pas la réponse dans la documentation. </p>
P粉738346380
P粉738346380

répondre à tous(1)
P粉541565322

C'est une mauvaise approche (inefficace) :

daily_max = db.session.query(db.func.count(Events.id),
            db.func.date_format(Events.timestamp_event,'%d/%m/%y'))\
            .group_by(db.func.date_format(Events.timestamp_event,'%Y%M%D'))\
            .order_by(db.func.count(Events.id).desc()).first()

Il regroupe toutes les paires (nombre d'identifiants, date), trie les paires dans l'ordre inverse du nombre et obtient la première paire.

Il fait le travail, mais j'aimerais vraiment connaître une manière efficace et élégante d'utiliser func.max().

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal