2010-09-03 8 views
0

J'ai une table assez simple dans SQLite, avec le schéma suivant:Trouver des lignes avec le maximum

CREATE TABLE IF NOT EXISTS Palettes 
      (id INTEGER PRIMARY KEY AUTOINCREMENT, 
      class TEXT, count INTEGER, name TEXT); 

Ceux-ci représentent des palettes de couleurs, et plusieurs palettes peuvent avoir le même nom, mais un nombre différent (c.-à-tailles) .

Ce que je veux faire est de trouver, pour chaque ensemble de palettes nommées, celui qui a le plus grand nombre (ou le moins) nombre.

Ma première pensée a été de commencer par:

SELECT * FROM Palettes GROUP BY name; 

Mais, bien sûr, quelle ligne je reçois est arbitraire. En regardant plus loin, il semble que même si je le fais:

SELECT MAX("count"), * FROM Palettes GROUP BY name; 

Je reçois toujours une ligne arbitraire. Un dernier coup:

SELECT * FROM (SELECT * FROM Palettes ORDER BY "count") GROUP BY name; 

semble travailler, mais je ne peux pas trouver aucune garantie partout.

Est-ce que quelqu'un a une solution à ce problème? Je peux, bien sûr, le résoudre en code, mais je préférerais une solution SQL, si possible.

Merci, -Matt

+2

J'ai ajouté la balise 'most-n-per-group'. Cliquez sur cette étiquette pour voir la réponse dans l'une des dizaines d'autres questions ici sur SO. –

+0

Merci de m'avoir indiqué dans la bonne direction - j'ai regardé, mais je suis à peine une ceinture orange à SQL-fu, donc je n'ai pas eu mes termes de recherche à droite. – Gretchen

Répondre

1

Cela devrait faire l'affaire:

SELECT P.* 
    FROM Palettes AS P JOIN 
     (SELECT name, MAX("count") AS max_count 
      FROM Palette 
     GROUP BY Name) AS MC 
     ON MC.Name = P.Name AND P."count" = MC.Max_Count; 

S'il y a plusieurs lignes avec le même nombre maximal pour un nom particulier, vous obtiendrez plusieurs lignes retournées. J'utilise des guillemets autour de "count" parce que c'est, bien sûr, aussi un mot-clé; les guillemets convertissent le nom en un identificateur délimité.

+0

Super - ça va marcher pour moi. Dans ce problème, si le nom est non nul, alors la paire nom/compte sera unique, donc je n'ai pas à m'inquiéter de plusieurs lignes (je peux gérer des palettes nommées NULL séparément). Bon à noter à propos de la citation de "count" - SQLite géré parse la requête même si je ne l'ai pas cité, mais mieux d'être sûr. Merci! – Gretchen

Questions connexes