PostgreSQL MAX et PAR GROUPE
J'ai une table avec id
, year
et count
.
Je veux obtenir le MAX(count)
pour chaque id
et de garder la year
quand il arrive, donc je fais cette requête:
SELECT id, year, MAX(count)
FROM table
GROUP BY id;
Malheureusement, il me donne une erreur:
ERREUR: la colonne "de la table.année" doit apparaître dans la clause GROUP BY ou être
utilisé dans une fonction d'agrégation
J'ai donc essayer:
SELECT id, year, MAX(count)
FROM table
GROUP BY id, year;
Mais alors, il ne fait pas de MAX(count)
, ça montre le tableau tel qu'il est. Je suppose, parce que lors d'un regroupement par year
et id
, il obtient le max pour le id
de cette année-là.
Alors, comment puis-je écrire cette requête? Je veux obtenir le id
s MAX(count)
et l'année qui arrive.
- si {id,an} sont uniques,
max(thing)
est le même quething
. Notez également que le "compteur" est un mot-clé, (et de l'année ainsi dans certains dialectes, IIRC) - En quelle année avez-vous envie de faire avec chaque id? Il n'y a pas un "à l'année", il y a plus d'un, peut-être vous voulez
MAX(year)
? - Ouais, ils sont uniques, donc je obtenir la chose. Je veux obtenir l'id MAX(chose) et aussi, de voir ce que l'année qui arrive. (Je n'ai pas écrit compter dans mon code, juste un exemple)
- Je veux obtenir l'année dans laquelle l'IDENTIFIANT maximise la "chose" de la colonne
Vous devez vous connecter pour publier un commentaire.
ou:
ou
ou (le même que le précédent avec une autre notation)
La plus courte (et éventuellement plus rapide) requête serait avec
DISTINCTES SUR
, un PostgreSQL extension de la norme SQLDISTINCT
clause:Les numéros se réfèrent aux positions ordinales dans le
SELECT
liste. Vous pouvez épeler les noms de colonne pour plus de clarté:Le résultat est commandé par
id
, qui peut ou peut ne pas être la bienvenue. C'est mieux que "undefined" dans tous les cas.Il rompt également des liens (lorsque plusieurs années partagent la même limite de nombre) dans un sens bien défini de la manière: choisir la première année. Si vous n'avez pas de soins, baisse
year
de laORDER BY
. Ou pour prendre la dernière année avecyear DESC
.Plus d'explications, des liens, une référence et peut-être plus rapidement des solutions à cet étroitement liés réponse:
De côté: Dans la vie réelle de la requête, vous ne pouvez pas utiliser certains des noms de colonne.
id
est un non-descriptif anti-modèle pour un nom de colonne,count
est un mot réservé en SQL standard et une fonction d'agrégation dans Postgres.