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:

SQL Server - Find MAX value from multiple columns in a SQL Server table
SQL Server - Find MAX value from multiple columns in a SQL Server table

Resultado Esperado:

SQL Server - Find MAX value from multiple columns in a SQL Server table - Expected Result
SQL Server - Find MAX value from multiple columns in a SQL Server table - Expected Result

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

SQL Server - Find MAX value from multiple columns in a SQL Server table - Performance 1
SQL Server - Find MAX value from multiple columns in a SQL Server table - Performance 1

Solução 2:

SQL Server - Find MAX value from multiple columns in a SQL Server table - Performance 2
SQL Server - Find MAX value from multiple columns in a SQL Server table - Performance 2

Solução 3:

SQL Server - Find MAX value from multiple columns in a SQL Server table - Performance 3
SQL Server - Find MAX value from multiple columns in a SQL Server table - Performance 3

Resultado final:

SQL Server - Find MAX value from multiple columns in a SQL Server table - Performance
SQL Server - Find MAX value from multiple columns in a SQL Server table - Performance

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