Как получить MIN () из двух полей в Postgres?

140

Допустим, у меня есть такая таблица:

name | score_a | score_b
-----+---------+--------
 Joe |   100   |   24
 Sam |    96   |  438
 Bob |    76   |  101
 ... |   ...   |  ...

Я хотел бы выбрать минимум для Score_a и Score_b. Другими словами, что-то вроде:

SELECT name, MIN(score_a, score_b)
FROM table

Результаты, конечно, будут:

name | min
-----+-----
 Joe |  24
 Sam |  96
 Bob |  76
 ... | ...

Однако, когда я пытаюсь сделать это в Postgres, я получаю: «Ни одна функция не соответствует заданному имени и типу аргумента. Возможно, вам придется добавить явное приведение типов». MAX () и MIN () работают по строкам, а не по столбцам.

Можно ли сделать то, что я пытаюсь?

Майк
источник

Ответы:

247

Меньше всего (а, б):

Функции GREATESTи LEASTвыбирают наибольшее или наименьшее значение из списка любого числа выражений. Все выражения должны быть преобразованы в общий тип данных, который будет типом результата (подробности см. В разделе 10.5 ). Значения NULL в списке игнорируются. Результатом будет NULL, только если все выражения оцениваются как NULL.

Обратите внимание, что GREATESTи LEASTне в стандарте SQL, но являются распространенным расширением. Некоторые другие базы данных заставляют их возвращать NULL, если любой аргумент равен NULL, а не только тогда, когда все имеют значение NULL ...

cagcowboy
источник
21
Для таких людей, как я, которым также понадобятся MAX()два значения, это GREATEST(a, b):)
вектор
-16

Вы можете получить ответ, поместив эти данные в столбец следующим образом:

SELECT name, MIN(score_a, score_b) as minimum_score
FROM table

Здесь мы помещаем минимальное значение среди score_aи score_bи печатаем одно и то же, сохраняя это значение в столбце с именем minimum_score.

Мохамед Аамир
источник
только min(expression)существует. Определение из документа: минимальное значение выражения для всех входных значений с `expression` - это любой числовой тип, строка, дата / время, тип сети или перечисления, или массивы этих типов
charlesdg