2010-01-23 6 views
1

Dire que j'ai une table comme ceci:un enregistrement de chaque groupe?

x1 | y1 | x2 | y2 | area | color 

5 | 0 | 5 | 0 | 1 | r 
5 | 0 | 6 | 0 | 2 | g 
5 | 1 | 5 | 0 | 2 | b 
5 | 1 | 5 | 1 | 2 | r 
5 | 2 | 5 | 0 | 3 | g 
5 | 2 | 5 | 1 | 3 | b 

Comment puis-je construire une requête SQL afin que la table résultante a une de r, g, b (chacun ayant la superficie maximale), mais aussi préserver les coordonnées de cet enregistrement? J'ai essayé MAX (AREA) et GROUP BY couleur, mais cela me donne des enregistrements avec une surface maximale pour r, g, b mais pas avec leurs coordonnées.

J'utilise Exemple de sortie de PostgreSQL (pour celui ci-dessus), devrait être quelque chose comme:

5 | 1 | 5 | 1 | 2 | r 
5 | 2 | 5 | 0 | 3 | g 
5 | 2 | 5 | 1 | 3 | b 

Fondamentalement, il devrait revenir 4ème, 5ème et 6ème disque.

+4

pouvez-vous montrer un échantillon de la sortie que vous voulez? –

+1

Pouvez-vous fournir un exemple de sortie de cette requête? J'ai un peu de mal à le comprendre. – llamaoo7

+0

Pas clair ce que vous cherchez. Par "la zone maximale", vous entendez la zone maximale pour toutes les couleurs, ou pour une couleur particulière? – John

Répondre

3

Votre question est un peu floue, mais je suppose que vous voulez ceci:

SELECT T2.* FROM (
    SELECT color, max(area) AS area 
    FROM table1 
    GROUP BY color) AS T1 
JOIN table1 AS T2 
ON T1.area = T2.area AND T1.color = T2.color 

Notez qu'il suppose que la superficie maximale est unique, sinon vous obtiendrez plusieurs lignes.

sortie pour vos données:

x1 | x2 | y1 | y2 | area | color 
5 | 1 | 5 | 1 | 2 |  r 
5 | 2 | 5 | 0 | 3 |  g 
5 | 2 | 5 | 1 | 3 |  b 

Si vous voulez une meilleure réponse, s'il vous plaît clarifier toutes les questions que j'ai posté sous forme de commentaires (certains d'entre eux sont cachés).

+0

C'est la bonne réponse étant donné la table décrite, mais joindre la table dérivée sur une clé primaire unique est une meilleure pratique. Que se passe-t-il lorsque plusieurs lignes 'r' ont la même zone, mais des données différentes ailleurs dans la rangée? –

+0

@Michael, Vous avez bien sûr raison d'utiliser un PK. J'ai demandé dans un commentaire s'il avait même une clé primaire, mais il n'a pas encore répondu. Par conséquent, je vais supposer qu'il n'a pas de PK jusqu'à ce qu'on lui dise le contraire.Malheureusement, beaucoup de mes commentaires demandant des éclaircissements ont été cachés :( –

+0

Pas de soucis, mon commentaire est dirigé vers l'OP, et quiconque regarde cela dans le futur –

0
select *, max(area), color from T group by color; 
Questions connexes