Это действительно хороший вопрос.Я уже прочитал некоторые полезные ответы здесь, но, вероятно, я могу добавить более точное объяснение.
Сократить число результатов запроса с помощью оператора GROUP BY легко, если вы не запрашиваете дополнительную информацию.Предположим, вы получили следующую таблицу 'location'.
--country-- --city--
France Lyon
Poland Krakow
France Paris
France Marseille
Italy Milano
Теперь запрос
SELECT country FROM locations
GROUP BY country
приведет к:
--country--
France
Poland
Italy
Однако следующий запрос
SELECT country, city FROM locations
GROUP BY country
... выдает ошибку в MS SQL, потому что как ваш компьютер может узнать, какой из трех французских городов "Лион", "Париж" или "Марсель" вы хотите прочитать в поле, чтобыправо «Франция»?
Чтобы исправить второй запрос, необходимо добавить эту информацию.Один из способов сделать это - использовать функции MAX () или MIN (), выбирая наибольшее или наименьшее значение среди всех кандидатов.MAX () и MIN () не только применимы к числовым значениям, но также сравнивают алфавитный порядок строковых значений.
SELECT country, MAX(city) FROM locations
GROUP BY country
приведет к:
--country-- --city--
France Paris
Poland Krakow
Italy Milano
или:
SELECT country, MIN(city) FROM locations
GROUP BY country
приведет к:
--country-- --city--
France Lyon
Poland Krakow
Italy Milano
Эти функции являются хорошим решением, если вы можете выбрать значение в любом из концов алфавитного (или числового) порядка.Но что, если это не так?Предположим, вам нужно значение с определенной характеристикой, например, начинающееся с буквы «М».Теперь все становится сложнее.
Единственное решение, которое я смог найти до сих пор, - это поместить весь ваш запрос в подзапрос и создать дополнительный столбец вне него руками:
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
приведет к:
--country-- --city--
France Marseille
Poland NULL
Italy Milano