Questa è davvero una bella domanda. Ho già letto alcune risposte utili qui, ma probabilmente posso aggiungere una spiegazione più precisa.
Ridurre il numero di risultati della query con un'istruzione GROUP BY è facile purché non si richiedano informazioni aggiuntive. Supponiamo che tu abbia la seguente tabella 'posizioni'.
--country-- --city--
France Lyon
Poland Krakow
France Paris
France Marseille
Italy Milano
Ora la domanda
SELECT country FROM locations
GROUP BY country
comporterà:
--country--
France
Poland
Italy
Tuttavia, la seguente query
SELECT country, city FROM locations
GROUP BY country
... genera un errore in MS SQL, perché come fa il tuo computer a sapere quale delle tre città francesi "Lione", "Parigi" o "Marsiglia" vuoi leggere nel campo a destra di "Francia"?
Per correggere la seconda query, è necessario aggiungere queste informazioni. Un modo per farlo è utilizzare le funzioni MAX () o MIN (), selezionando il valore più grande o più piccolo tra tutti i candidati. MAX () e MIN () non si applicano solo ai valori numerici, ma confrontano anche l'ordine alfabetico dei valori di stringa.
SELECT country, MAX(city) FROM locations
GROUP BY country
comporterà:
--country-- --city--
France Paris
Poland Krakow
Italy Milano
o:
SELECT country, MIN(city) FROM locations
GROUP BY country
comporterà:
--country-- --city--
France Lyon
Poland Krakow
Italy Milano
Queste funzioni sono una buona soluzione purché tu stia bene selezionando il tuo valore da entrambe le estremità dell'ordine alfabetico (o numerico). E se non fosse così? Supponiamo che tu abbia bisogno di un valore con una certa caratteristica, ad esempio iniziando con la lettera "M". Ora le cose si complicano.
L'unica soluzione che ho trovato finora è mettere l'intera query in una sottoquery e costruire manualmente la colonna aggiuntiva al di fuori di essa:
SELECT
countrylist.*,
(SELECT TOP 1 city
FROM locations
WHERE
country = countrylist.country
AND city like 'M%'
)
FROM
(SELECT country FROM locations
GROUP BY country) countrylist
comporterà:
--country-- --city--
France Marseille
Poland NULL
Italy Milano
SELECT DISTINCT * FROM table
non funziona per te?