1
votes

Postgresql Obtenir la valeur maximale de chaque groupe avec plusieurs colonnes

J'ai le tableau suivant

random_number |   band    | member_name
-----------------------------------------
     2800     | Metallica |  Roberto
     150      | SkidRow   |  Dave
     500      | Motorhead |  Lemmy

Comment pourrais-je obtenir le plus grand numéro_aléatoire de chaque bande et renvoyer quelque chose comme ceci:

CREATE table test
(
    random_number INT,
    band VARCHAR(255),
    member_name VARCHAR(255)
);

INSERT INTO test VALUES(2300,'Metallica', 'Kirk');
INSERT INTO test VALUES(2000,'Metallica', 'Lars');
INSERT INTO test VALUES(2500,'Metallica', 'James');
INSERT INTO test VALUES(2800,'Metallica', 'Roberto');
INSERT INTO test VALUES(100,'SkidRow', 'Sebastian');
INSERT INTO test VALUES(140,'SkidRow', 'Rachel');
INSERT INTO test VALUES(110,'SkidRow', 'Scott');
INSERT INTO test VALUES(150,'SkidRow', 'Dave');
INSERT INTO test VALUES(100,'SkidRow', 'Rob');
INSERT INTO test VALUES(500,'Motorhead', 'Lemmy');
INSERT INTO test VALUES(100,'Motorhead', 'Mikkey');
INSERT INTO test VALUES(200,'Motorhead', 'Phil');


1 commentaires

Découvrez les fonctions de la fenêtre: stackoverflow.com/questions/3800551/...


3 Réponses :


-1
votes

Utilisez MAX()

no  max band
1   2800 Metallica
2   500 Motorhead
3   150 SkidRow

Voir: https : //rextester.com/BEZD44968

Le résultat serait:

SELECT max(random_number), band FROM test GROUP BY band


2 commentaires

Merci pour votre réponse. Je voudrais voir le member_name dans le résultat.


Ah, alors utilisez distinct. Voir la réponse de @ Gordon.



6
votes

Utilisez distinct sur :

select distinct on (band) t.*
from test t
order by band, random_number desc;

Voici un violon db .

distinct sur est une extension Postgres très pratique. Pour les performances sur de grands ensembles de données, vous voulez un index sur (band, random_number desc) .


0 commentaires

4
votes

Trouvez le random_number maximum en groupant et joignez-le à la table:

select t.* 
from test t inner join (
  select band, max(random_number) maxnum from test group by band
) g
on g.band = t.band and g.maxnum = t.random_number

Voir le démo


0 commentaires