Olá leitores,
Boa noite!
Neste post vou demonstrar rapidamente como recuperar o maior valor entre múltiplas colunas em uma tabela do SQL Server. Já vi várias soluções para essa necessidade, mas será que você está utilizando a mais performática dentre elas ?
Gerando uma massa de testes
Para facilitar a visualização dos resultados, vamos criar alguns dados de teste:
IF ( OBJECT_ID('tempdb..##Teste') IS NOT NULL ) DROP TABLE ##Teste
CREATE TABLE ##Teste (
ID INT IDENTITY(1, 1) PRIMARY KEY,
Nome NVARCHAR(40),
Data1 DATETIME,
Data2 DATETIME,
Data3 DATETIME
)
DECLARE
@Dt_Inicial DATETIME = '1900-01-01',
@Dt_Final DATETIME = '2099-04-02',
@Contador INT = 1
WHILE(@Dt_Inicial <= @Dt_Final)
BEGIN
INSERT INTO ##Teste ( Nome, Data1, Data2, Data3 )
SELECT
'Teste ' + CAST(@Contador AS VARCHAR(20)),
@Dt_Inicial,
DATEADD(DAY, ABS(CHECKSUM(NEWID()) % 5000) - ABS(CHECKSUM(NEWID()) % 5000), GETDATE()),
DATEADD(DAY, ABS(CHECKSUM(NEWID()) % 5000) - ABS(CHECKSUM(NEWID()) % 5000), GETDATE())
SET @Dt_Inicial = DATEADD(DAY, 1, @Dt_Inicial)
SET @Contador = @Contador + 1
END
SELECT * FROM ##Teste
Dados Originais:

Resultado Esperado:

Solução 1 – Utilizando VALUES
SELECT
ID,
(
SELECT MAX(UltimoAcesso)
FROM (VALUES (Data1),(Data2),(Data3)) AS UltimoAcesso(UltimoAcesso)
) AS UltimoAcesso
FROM
##Teste
Solução 2 – Utilizando UNPIVOT
SELECT
ID,
MAX(UltimoAcesso) AS UltimoAcesso
FROM
##Teste
UNPIVOT ( UltimoAcesso FOR DateVal IN ( Data1, Data2, Data3 ) ) AS u
GROUP BY
ID,
Nome
Solução 3 – Utilizando UNION
SELECT
ID,
MAX(UltimoAcesso) AS UltimoAcesso
FROM
(
SELECT ID, Data1 AS UltimoAcesso
FROM ##Teste
UNION
SELECT ID, Data2 AS UltimoAcesso
FROM ##Teste
UNION
SELECT ID, Data3 AS UltimoAcesso
FROM ##Teste
) ud
GROUP BY
ID
Teste de Performance
Após entendermos as 3 soluções propostas acima, vamos testar a performance para identificar qual é executada com o menor tempo e custo possível. Desta forma, poderemos dizer qual deve ser a melhor solução adotada para essa situação:
Solução 1

Solução 2:

Solução 3:

Resultado final:

Como podemos observar, a solução 1 além de ser bem pequena, é a mais performática.
Obrigado pela visita!
sql server maior valor múltiplas várias colunas de uma tabela view query Find MAX value from multiple columns in a SQL Server table
sql server maior valor múltiplas várias colunas de uma tabela view query Find MAX value from multiple columns in a SQL Server table
Comentários (0)
Carregando comentários…