Como obtenho o MIN () de dois campos no Postgres?

140

Digamos que eu tenho uma tabela como esta:

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

Gostaria de selecionar o mínimo de score_a e score_b. Em outras palavras, algo como:

SELECT name, MIN(score_a, score_b)
FROM table

Os resultados, é claro, seriam:

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

No entanto, quando eu tento isso no Postgres, recebo: "Nenhuma função corresponde ao nome e aos tipos de argumento. Talvez seja necessário adicionar conversões de tipo explícitas". MAX () e MIN () parecem funcionar em linhas, em vez de colunas.

É possível fazer o que estou tentando?

Mike
fonte

Respostas:

246

PELO MENOS (a, b):

As funções GREATESTe LEASTselecionam o valor maior ou menor de uma lista de qualquer número de expressões. Todas as expressões devem ser conversíveis em um tipo de dados comum, que será o tipo do resultado (consulte a Seção 10.5 para obter detalhes). Valores NULL na lista são ignorados. O resultado será NULL apenas se todas as expressões forem avaliadas como NULL.

Observe que GREATESTe LEASTnão estão no padrão SQL, mas são uma extensão comum. Alguns outros bancos de dados fazem com que retornem NULL se algum argumento for NULL, e não apenas quando todos forem NULL ...

cagcowboy
fonte
20
Para pessoas como eu que também vai precisar MAX()de dois valores, é GREATEST(a, b):)
vektor
-16

Você pode obter a resposta colocando esses dados em uma coluna como esta:

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

Aqui, estamos colocando o valor mínimo entre score_ae score_be imprimindo o mesmo, armazenando esse valor em uma coluna denominada minimum_score.

Mohamed Aamir
fonte
somente min(expression)existe. Definição do doc: valor mínimo da expressão entre todos os valores de entrada with` expression` é qualquer numérico, cadeia, data / hora, rede, ou tipo enum, ou matrizes desses tipos
charlesdg