web-dev-qa-db-fra.com

PostgreSQL MAX et GROUP BY

J'ai une table avec id, year et count.

Je veux obtenir la MAX(count) pour chaque id et garder la year quand cela se produit, alors je fais cette requête:

SELECT id, year, MAX(count)
FROM table
GROUP BY id;

Malheureusement, cela me donne une erreur:

ERREUR: la colonne "table.année" doit apparaître dans la clause GROUP BY ou être utilisée dans une fonction d'agrégation

J'essaye donc:

SELECT id, year, MAX(count)
FROM table
GROUP BY id, year;

Mais alors, il ne fait pas MAX(count), il montre simplement le tableau tel quel. Je suppose que lorsque le regroupement par year et id, il obtient le maximum pour le id de cette année spécifique.

Alors, comment puis-je écrire cette requête? Je veux obtenir le id´s MAX(count) et l'année où cela se produit.

33
Project Dumbo Dev
select *
from (
  select id, 
         year,
         thing,
         max(thing) over (partition by id) as max_thing
  from the_table
) t
where thing = max_thing

ou:

select t1.id,
       t1.year,
       t1.thing
from the_table t1
where t1.thing = (select max(t2.thing) 
                  from the_table t2
                  where t2.id = t1.id);

ou

select t1.id,
       t1.year,
       t1.thing
from the_table t1
  join ( 
    select id, max(t2.thing) as max_thing
    from the_table t2
    group by id
  ) t on t.id = t1.id and t.max_thing = t1.thing

ou (identique à la précédente avec une notation différente)

with max_stuff as (
  select id, max(t2.thing) as max_thing
  from the_table t2
  group by id
) 
select t1.id, 
       t1.year,
       t1.thing
from the_table t1
  join max_stuff t2 
    on t1.id = t2.id 
   and t1.thing = t2.max_thing
41