7
votes

Groupe Postgres par fonction d'agrégation

J'ai une table de messages qui ressemble à ceci: xxx

Je souhaite sélectionner le message unique le plus récent pour chaque expéditeur.

Ceci semble être un groupe par Sender_ID et commander par Create_AT, mais j'ai du mal à obtenir le message le plus récent sélectionné.

J'utilise des postgres, alors besoin d'une fonction d'agrégation sur le Cared_at champ dans la déclaration SELECT si je veux commander par ce champ, donc je cherchais à faire quelque chose comme celui-ci comme un test initial xxx

Ceci semble fonctionner mais quand je veux Pour sélectionner «Message», je n'ai aucune idée de la fonction d'agrégat à utiliser dessus. Je veux fondamentalement juste le message correspondant au max créé_at.

Y a-t-il un moyen d'obtenir à cela ou que je m'approche du mauvais moyen?


1 commentaires

Sur quelle version êtes-vous sur?


3 Réponses :


9
votes

Ceci: xxx

ou ceci: xxx

créer un index sur (sender_id, créé_at) Pour que cela fonctionne vite.

Vous pouvez trouver cet article intéressant:


7 commentaires

Celui-ci donne un résultat différent, l'ordre de tri est différent.


@FRANK: Vous pouvez l'utiliser A comme sous-requête et réorganiser les résultats avec votre requête supérieure.


@Frank: La question initiale n'a pas mentionné la commande sur sender_id , mais voici la requête avec la commande corrigée.


En ce qui concerne l'article, je ne peux utiliser aucune des méthodes de 8.4 telles que Windows Fonctions comme je suis sur 8.3. La 2e requête que vous avez donnée présente une erreur (erreur de syntaxe ou proche de "MI"). J'ai besoin que la commande soit à ce jour, vous ne pouvez donc pas utiliser l'idée distincte non plus.


@johnnymire: Voir la mise à jour post. Quant à la deuxième requête, quelle ligne donne-t-elle l'erreur?


Pgerror: Erreur: Erreur de syntaxe à ou proche "MI" Ligne 1: ... id = m.sender_id ordre par the_date Desc Limite 1) MI de ..


Génial c'est fait, merci! Je vais expérimenter avec les index pour tenter de l'accélérer.



1
votes

Utilisez une sous-requête corrélée:

select * from messages m1 
where m1.created_at = (
    select max(m2.create_at) 
    from messages m2 
    where m1.sender_id = m2.sender_id
);


0 commentaires

0
votes

Utiliser distinct sur:

    SELECT DISTINCT ON (sender_id) 
           sender_id,created_at,message
      FROM messages
  ORDER BY sender_id,created_at DESC


0 commentaires