Подтвердить что ты не робот

Функция SQL MAX в нечисловых столбцах

Насколько я понимаю функцию MAX, она должна вернуть максимальное значение из данного столбца. В случае числовых значений, например столбца зарплаты, для меня это понятно - и это единственное приложение, которое я нахожу в учебниках. Однако у меня есть проблема, чтобы понять, как это работает в случае нечисловых столбцов.

Мои проблемы возникают из этого упражнения (на sql-ex.ru)

Узнайте производителей, которые производят только модели того же типа, и число этих моделей превышает 1. Таблица "Продукт" содержит информацию о производителе, номере модели и типе ( "ПК", "Ноутбук" или "Принтер" ). Одним из решений этого является:

SELECT maker,
       MAX(type) AS type
FROM   product
GROUP  BY maker
HAVING COUNT(DISTINCT type) = 1
       AND COUNT(model) > 1 

Я не понимаю функцию max - что она подсчитывает? Я попробовал более простой запрос, чтобы понять это, но это только усложнило работу.

SELECT maker,
       MAX(type) AS type, COUNT(type) AS QTY
FROM product
GROUP BY maker
ORDER BY maker

Возвращаемое значение было

maker  type      QTY
A      Printer   7
B      PC        2
C      Laptop    1
D      Printer   2
E      Printer   4

Мне кажется, что MAX (тип) показывает случайное значение, например. почему для создателя B результатом является ПК, а не ноутбук? Почему для E это принтер, а не ПК?

Полный стол
 http://i.stack.imgur.com/gObvQ.png

4b9b3361

Ответ 1

Функции MAX, MIN и т.д. используют лексикографический порядок при применении к текстовым столбцам. Поэтому ваш MAX (тип) вернет "Принтер" вместо "ПК", потому что "Принтер" находится после (больше, чем) "ПК" в алфавитном порядке.

Обратите внимание, что в вашем первом запросе условие HAVING COUNT(distinct type) = 1 означает, что для каждой группы может быть только одно значение type. Предложение MAX(type) в select используется, потому что просто type не может использоваться в select, поскольку оно не находится в предложении GROUP BY.

Ответ 2

В столбцах символов MAX находит наибольшее значение в последовательности сортировки. В корпусе ПК и ноутбука символ "P" идет после символа "L", поэтому результатом MAX является ПК. Принтер и ПК: первые буквы равны, но символ "r" идет после "C", поэтому результатом MAX является "Принтер".

Ответ 3

MAX(), используемый в строке, оценивает значения в алфавитном порядке и длине, a > b, но ab > a.

В вашем случае предложение HAVING ограничивает значение type для всех записей для данного maker, поэтому MAX() и GROUP BY используются только для возврата одной строки, и не имеет значения, какое значение type возвращается, потому что они одинаковы для всех строк, которые могут быть возвращены.

Если вы измените свой второй запрос, это может помочь вам понять, как все это работает:

SELECT maker
     , MAX (type) AS maxType
     , MIN (type) AS minType
     , COUNT(DISTINCT type) AS QTY
     , COUNT(model) AS Models
FROM product
GROUP BY maker
ORDER BY maker

Демо: SQL Fiddle

Первый запрос также может быть переписан как:

SELECT maker
     , MIN(type)
FROM product
GROUP BY maker
HAVING MAX(type) = MIN(type)
   AND COUNT(model) > 1
ORDER BY maker