2017-09-15 6 views
0

J'ai une table nommée « démo » avec les données suivantes:Sélectionnez des lignes identiques en fonction des valeurs maximales d'une colonne et seulement choisir une des lignes lorsque max est égal à

 
Name Group MX 
A  XY  1 
B  YZ  1 
B  XY  2 
C  YZ  5 
C  XY  3 
D  YZ  2 
E  YZ  1 
E  XY  1 

Je veux des noms uniques basés sur « MX «valeur maximale, lorsque le « MX » pour deux noms identiques sont égaux je besoin d'un d'entre eux comme illustré ci-dessous:

 
Name Group MX 
A  XY  1 
B  XY  2 
C  YZ  5 
D  YZ  2 
E  YZ  1 -- or this {E XY 1} 

Voici ma requête:

SELECT demo.Name, demo.Group, demo.MX 
    FROM ( 
     SELECT Name, MAX(MX) AS max_values 
     FROM demo 
     GROUP BY Name 
    ) demo2 
INNER JOIN demo 
ON demo.Name = demo2.Name 
AND demo.MX = demo2.max_values 

Il travaille de façon charmante, mais quand les deux noms sont identiques, il affiche à la fois comme suit:

 
Name Group MX 
A  XY  1 
B  XY  2 
C  YZ  5 
D  YZ  2 
E  YZ  1 
E  XY  1 

Quelles méthodes préconisez-vous?

+0

Voir: [Pourquoi devrais-je fournir un MCVE pour ce qui me semble être une requête SQL très simple?] (https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a- requête très simple-sql) – Strawberry

Répondre

0

pour éviter deux valeurs où Nom et MX sont vous égaux pouvez utiliser par exemple une fonction d'agrégation (fake) et le groupe:

SELECT demo.Name, min(demo.Group), demo.MX 
    FROM ( 
     SELECT Name, MAX(MX) AS max_values 
     FROM demo 
     GROUP BY Name 
    ) demo2 
INNER JOIN demo ON demo.Name = demo2.Name AND demo.MX = demo2.max_values 
GROUP BY demo.Name, demo.MX