Eu quero escrever uma consulta como esta:
SELECT o.OrderId, MAX(o.NegotiatedPrice, o.SuggestedPrice)
FROM Order o
Mas não é assim que a MAX
função funciona, certo? É uma função agregada, portanto, espera um único parâmetro e, em seguida, retorna o MAX de todas as linhas.
Alguém sabe como fazer do meu jeito?
sql
sql-server
max
skb
fonte
fonte
GREATEST
função; O SQLite emula o suporte, permitindo várias colunas noMAX
agregado.Respostas:
Você precisaria fazer um
User-Defined Function
se quisesse ter uma sintaxe semelhante ao seu exemplo, mas poderia fazer o que deseja fazer, em linha, com bastante facilidade com umaCASE
declaração, como os outros disseram.O
UDF
poderia ser algo como isto:... e você chamaria assim ...
fonte
Se você estiver usando o SQL Server 2008 (ou superior), esta é a melhor solução:
Todo crédito e votos devem ir para a resposta de Sven para uma pergunta relacionada, "SQL MAX de várias colunas?"
Eu digo que é a " melhor resposta " porque:
SELECT MAX (a), MAX (b) FROM (VALUES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10)) COMO Minha Tabela (a, b)
fonte
Pode ser feito em uma linha:
Editar: se você estiver lidando com números muito grandes, precisará converter as variáveis de valor em bigint para evitar um estouro de número inteiro.
fonte
Acho que não. Eu queria isso outro dia. O mais próximo que cheguei foi:
fonte
Por que não tentar a função IIF (requer o SQL Server 2012 e posterior)
É isso aí.
(Dica: tenha cuidado com qualquer um deles
null
, pois o resultado dea>b
será falso sempre que um for nulo. Portantob
, será o resultado nesse caso)fonte
NULL
, o resultado será sempre o segundo.NULL > 1234
afirmação é falsa #IIF(a>b, a, COALESCE(b,a))
a dar o valor quando só existe umfonte
As outras respostas são boas, mas se você precisar se preocupar com valores NULL, convém esta variante:
fonte
No SQL Server 2012 ou superior, você pode usar uma combinação de
IIF
eISNULL
(ouCOALESCE
) para obter o máximo de 2 valores.Mesmo quando um deles é NULL.
Ou se você desejar retornar 0 quando ambos forem NULL
Fragmento de exemplo:
Resultado:
Mas se é necessário somar vários valores?
Então, sugiro que CROSS APPLY a uma agregação dos VALUES.
Isso também tem o benefício de poder calcular outras coisas ao mesmo tempo.
Exemplo:
fonte
As subconsultas podem acessar as colunas da consulta externa para que você possa usar essa abordagem para usar agregados, como
MAX
nas colunas. (Provavelmente é mais útil quando há um número maior de colunas envolvidas)fonte
VALUES
sintaxe é melhor.Introdução ao SQL Server 2012
IIF
:O manuseio de NULLs é recomendado durante o uso
IIF
, porque umNULL
dos ladosboolean_expression
fará comIIF
que você retornefalse_value
(ao contrário deNULL
).fonte
Eu iria com a solução fornecida por kcrumley Apenas modifique-a um pouco para lidar com NULLs
EDIT Modificado após o comentário de Mark . Como ele apontou corretamente em 3 lógicas valorizadas, x> NULL ou x <NULL devem sempre retornar NULL. Em outras palavras, resultado desconhecido.
fonte
É tão simples quanto isto:
fonte
fonte
Ops, acabei de postar uma piada dessa pergunta ...
A resposta é: não existe uma função integrada como o Oracle's Greatest , mas você pode obter um resultado semelhante para duas colunas com uma UDF. Observe que o uso de sql_variant é bastante importante aqui.
Kristof
Publicou esta resposta:
fonte
Aqui está um exemplo de caso que deve tratar nulos e funcionará com versões mais antigas do MSSQL. Isso se baseia na função embutida em um dos exemplos populares:
fonte
Provavelmente não faria dessa maneira, pois é menos eficiente do que as construções CASE já mencionadas - a menos que, talvez, você tenha coberto índices para as duas consultas. De qualquer forma, é uma técnica útil para problemas semelhantes:
fonte
Para a resposta acima sobre números grandes, você pode fazer a multiplicação antes da adição / subtração. É um pouco mais volumoso, mas não requer elenco. (Não posso falar em velocidade, mas presumo que ainda seja muito rápido)
Muda para
pelo menos uma alternativa, se você quiser evitar a transmissão.
fonte
Aqui está uma versão IIF com manipulação NULL (com base na resposta do Xin):
A lógica é a seguinte, se um dos valores for NULL, retorne aquele que não for NULL (se ambos forem NULL, um NULL será retornado). Caso contrário, retorne o maior.
O mesmo pode ser feito para MIN.
fonte
Você pode fazer algo assim:
fonte
fonte
fonte
Na sua forma mais simples ...
fonte
Para o SQL Server 2012:
fonte
Aqui está a resposta de @Scott Langham com manipulação simples de NULL:
fonte
fonte
fonte
VALUES
inline como esse, não tenho certeza se isso é mais simples queCASE
ouIFF
. Eu ficaria interessado em ver como o desempenho desta solução se compara às outras opçõesExpandindo a resposta de Xin e assumindo que o tipo de valor de comparação é INT, essa abordagem também funciona:
Este é um teste completo com valores de exemplo:
fonte
No MemSQL, faça o seguinte:
fonte
No Presto você pode usar o uso
fonte