Esa es una muy buena pregunta. Ya he leído algunas respuestas útiles aquí, pero probablemente pueda agregar una explicación más precisa.
Reducir el número de resultados de la consulta con una instrucción GROUP BY es fácil siempre que no consulte información adicional. Supongamos que tiene la siguiente tabla 'ubicaciones'.
--country-- --city--
France Lyon
Poland Krakow
France Paris
France Marseille
Italy Milano
Ahora la consulta
SELECT country FROM locations
GROUP BY country
resultará en:
--country--
France
Poland
Italy
Sin embargo, la siguiente consulta
SELECT country, city FROM locations
GROUP BY country
... arroja un error en MS SQL, porque ¿cómo podría saber su computadora cuál de las tres ciudades francesas "Lyon", "París" o "Marsella" desea leer en el campo a la derecha de "Francia"?
Para corregir la segunda consulta, debe agregar esta información. Una forma de hacerlo es utilizar las funciones MAX () o MIN (), seleccionando el valor más grande o más pequeño entre todos los candidatos. MAX () y MIN () no solo son aplicables a valores numéricos, sino que también comparan el orden alfabético de los valores de cadena.
SELECT country, MAX(city) FROM locations
GROUP BY country
resultará en:
--country-- --city--
France Paris
Poland Krakow
Italy Milano
o:
SELECT country, MIN(city) FROM locations
GROUP BY country
resultará en:
--country-- --city--
France Lyon
Poland Krakow
Italy Milano
Estas funciones son una buena solución siempre que esté bien con la selección de su valor de los extremos del orden alfabético (o numérico). Pero, ¿y si este no es el caso? Supongamos que necesita un valor con cierta característica, por ejemplo, comenzando con la letra 'M'. Ahora las cosas se complican.
La única solución que pude encontrar hasta ahora es poner toda su consulta en una subconsulta y construir la columna adicional fuera de ella a mano:
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
resultará en:
--country-- --city--
France Marseille
Poland NULL
Italy Milano
SELECT DISTINCT * FROM table
no funciona para ti?