Como você retorna 1 valor por linha do máximo de várias colunas:
Nome da tabela
[Number, Date1, Date2, Date3, Cost]
Preciso retornar algo como isto:
[Number, Most_Recent_Date, Cost]
Inquerir?
sql
sql-server
tsql
BenB
fonte
fonte
WHEN Date1 > Date2 AND Date1 > Date3 THEN Date1; WHEN Date2 > Date3 THEN Date3; ELSE Date3
?Aqui está outra boa solução para a
Max
funcionalidade usando T-SQL e SQL Serverfonte
Se você estiver usando o MySQL, poderá usar
fonte
Existem mais 3 métodos em que
UNPIVOT
(1) é o mais rápido de longe, seguido por Simulação não dinâmica (3), que é muito mais lenta que (1), mas ainda mais rápida que (2)Solução 1 (
UNPIVOT
)Solução 2 (subconsulta por linha)
Solução 3 (Simulada
UNPIVOT
)fonte
Qualquer uma das duas amostras abaixo funcionará:
O segundo é um complemento para a resposta de lassevk .
fonte
Para T-SQL (MSSQL 2008+)
fonte
fonte
A função escalar causa todos os tipos de problemas de desempenho; portanto, é melhor agrupar a lógica em uma função com valor de tabela embutida, se possível. Esta é a função que eu usei para substituir algumas funções definidas pelo usuário que selecionaram as datas Mín / Máx de uma lista de até dez datas. Quando testada no meu conjunto de dados de 1 milhão de linhas, a Função Escalar demorou mais de 15 minutos antes de interromper a consulta. Para usar esta chamada, a função de uma subconsulta no SELECT ou em um CROSS APPLY.
fonte
Isso é um pouco mais fácil de escrever e ignora as etapas de avaliação, pois a instrução de caso é avaliada em ordem.
fonte
Infelizmente, a resposta de Lasse , embora aparentemente óbvia, tem uma falha crucial. Ele não pode manipular valores NULL. Qualquer valor NULL único resulta no retorno de Data1. Infelizmente, qualquer tentativa de corrigir esse problema tende a ficar extremamente bagunçada e não aumenta muito bem para 4 ou mais valores.
A primeira resposta de databyss parecia (e é) boa. No entanto, não ficou claro se a resposta extrapolaria facilmente para 3 valores de uma junção de várias tabelas em vez dos 3 valores mais simples de uma única tabela. Eu queria evitar transformar essa consulta em uma subconsulta apenas para obter o máximo de 3 colunas. Também tinha certeza de que a excelente idéia dos bancos de dados poderia ser um pouco mais limpa.
Portanto, sem mais delongas, aqui está a minha solução (derivada da ideia do databyss).
Ele usa junções cruzadas selecionando constantes para simular o efeito de uma junção de várias tabelas. O importante a ser observado é que todos os aliases necessários são executados corretamente (o que nem sempre é o caso) e isso mantém o padrão bastante simples e razoavelmente escalável por meio de colunas adicionais.
fonte
Problema: escolha o valor mínimo da taxa dado a uma entidade Requisitos: As taxas da agência podem ser nulas
Inspirado por esta resposta de Nat
fonte
Se você estiver usando o SQL Server 2005, poderá usar o recurso UNPIVOT. Aqui está um exemplo completo:
fonte
Usando CROSS APPLY (para 2005+) ....
fonte
No SQL Server 2012, podemos usar o IIF .
fonte
DECLARE @Date1 DATE='2014-08-01'; DECLARE @Date2 DATE=null; DECLARE @Date3 DATE='2014-07-05'; /*this gets returned*/
select IIF(@Date1 > @Date2 or @Date2 is null, IIF(@Date1 > @Date3 or @Date3 is null, @Date1, @Date3), IIF(@Date2 > @Date3 or @Date3 is null, @Date2, @Date3)) as MostRecentDate
Por favor, tente usar
UNPIVOT
:fonte
Prefiro soluções baseadas em caso-em-caso, minha suposição é que ela tenha o menor impacto possível na queda de desempenho em comparação com outras soluções possíveis, como aquelas com aplicação cruzada, valores (), funções personalizadas etc.
Aqui está a versão case-when que lida com valores nulos com a maioria dos casos de teste possíveis:
e o resultado é:
fonte
Você pode criar uma função na qual passa as datas e, em seguida, adiciona a função à instrução select como abaixo. selecione Número, dbo.fxMost_Recent_Date (Data1, Data2, Data3), Custo
(@ Date1 smalldatetime, @ Date2 smalldatetime, @ Date3 smalldatetime) RETORNA smalldatetime COMO COMEÇAR A DECLARAR @Result smalldatetime
FIM
fonte
Com base na solução de ScottPletcher , de http://www.experts-exchange.com/Microsoft/Development/MS-SQL-Server/Q_24204894.html , criei um conjunto de funções (por exemplo, GetMaxOfDates3, GetMaxOfDates13) para encontrar o máximo de até 13 valores de data usando UNION ALL. Consulte a função T-SQL para obter o máximo de valores da mesma linha. No entanto, não considerei a solução UNPIVOT no momento em que escrevi essas funções.
fonte
Outra maneira de usar CASE WHEN
fonte
A tabela acima é uma tabela salarial de funcionários com salário1, salário2, salário3, salário4 como colunas. A consulta abaixo retornará o valor máximo de quatro colunas
A execução acima da consulta fornecerá a saída como o maior valor (10001)
A lógica da consulta acima é a seguinte:
saída será 10001
fonte
aqui está uma boa solução:
fonte
Eu não sei se é no SQL, etc ... na ajuda do M $ ACCESS, existe uma função chamada
MAXA(Value1;Value2;...)
que deveria fazer isso.A esperança pode ajudar alguém.
PD: os valores podem ser colunas ou calculados, etc.
fonte
MAXA
é uma função do Excel , não o Access.