To naprawdę dobre pytanie. Przeczytałem już kilka przydatnych odpowiedzi tutaj, ale prawdopodobnie mogę dodać bardziej precyzyjne wyjaśnienie.
Zmniejszenie liczby wyników zapytań za pomocą instrukcji GROUP BY jest łatwe, o ile nie zapytasz o dodatkowe informacje. Załóżmy, że masz następującą tabelę „lokalizacje”.
--country-- --city--
France Lyon
Poland Krakow
France Paris
France Marseille
Italy Milano
Teraz zapytanie
SELECT country FROM locations
GROUP BY country
spowoduje:
--country--
France
Poland
Italy
Jednak następujące zapytanie
SELECT country, city FROM locations
GROUP BY country
... zgłasza błąd w MS SQL, ponieważ skąd twój komputer może wiedzieć, które z trzech francuskich miast „Lyon”, „Paryż” lub „Marsylia” chcesz przeczytać w polu po prawej stronie „Francja”?
Aby poprawić drugie zapytanie, musisz dodać tę informację. Jednym ze sposobów jest skorzystanie z funkcji MAX () lub MIN (), wybierając największą lub najmniejszą wartość spośród wszystkich kandydatów. MAX () i MIN () mają zastosowanie nie tylko do wartości liczbowych, ale także porównują kolejność alfabetyczną wartości ciągów.
SELECT country, MAX(city) FROM locations
GROUP BY country
spowoduje:
--country-- --city--
France Paris
Poland Krakow
Italy Milano
lub:
SELECT country, MIN(city) FROM locations
GROUP BY country
spowoduje:
--country-- --city--
France Lyon
Poland Krakow
Italy Milano
Te funkcje są dobrym rozwiązaniem, o ile nie przeszkadza ci wybranie wartości z obu końców kolejności alfabetycznej (lub numerycznej). Ale co, jeśli tak nie jest? Załóżmy, że potrzebujesz wartości o określonej charakterystyce, np. Zaczynającej się na literę „M”. Teraz sprawy się komplikują.
Jedynym rozwiązaniem, jakie do tej pory mogłem znaleźć, jest umieszczenie całego zapytania w podzapytaniu i zbudowanie dodatkowej kolumny poza nim ręcznie:
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
spowoduje:
--country-- --city--
France Marseille
Poland NULL
Italy Milano
SELECT DISTINCT * FROM table
nie działa dla ciebie?