Hola lectores,
¡Buenas noches!

En esta publicación, demostraré rápidamente cómo recuperar el valor más grande entre varias columnas en una tabla de SQL Server. He visto varias soluciones para esta necesidad, pero ¿estás utilizando la de mayor rendimiento entre ellas?

Generando una masa de pruebas.

Para facilitar la visualización de los resultados, creemos algunos datos de prueba:

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

Datos originales:

SQL Server - Find MAX value from multiple columns in a SQL Server table
SQL Server: busque el valor MAX de varias columnas en una tabla de SQL Server

Resultado esperado:

SQL Server - Find MAX value from multiple columns in a SQL Server table - Expected Result
SQL Server: busque el valor MAX de varias columnas en una tabla de SQL Server: resultado esperado

Solución 1: usar VALORES

SELECT 
    ID, 
    (
        SELECT MAX(UltimoAcesso)
        FROM (VALUES (Data1),(Data2),(Data3)) AS UltimoAcesso(UltimoAcesso)
    ) AS UltimoAcesso
FROM 
    ##Teste

Solución 2: uso de UNPIVOT

SELECT
    ID,
    MAX(UltimoAcesso) AS UltimoAcesso
FROM
    ##Teste 
    UNPIVOT ( UltimoAcesso FOR DateVal IN ( Data1, Data2, Data3 ) ) AS u
GROUP BY
    ID,
    Nome

Solución 3 – Usando 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

Prueba de rendimiento

Luego de comprender las 3 soluciones propuestas anteriormente, probaremos el rendimiento para identificar cuál se ejecuta con el menor tiempo y costo posible. De esta manera podremos decir cuál debería ser la mejor solución adoptada para esta situación:

Solución 1

SQL Server - Find MAX value from multiple columns in a SQL Server table - Performance 1
SQL Server: busque el valor MAX de varias columnas en una tabla de SQL Server: rendimiento 1

Solución 2:

SQL Server - Find MAX value from multiple columns in a SQL Server table - Performance 2
SQL Server: busque el valor MAX de varias columnas en una tabla de SQL Server - Rendimiento 2

Solución 3:

SQL Server - Find MAX value from multiple columns in a SQL Server table - Performance 3
SQL Server: busque el valor MAX de varias columnas en una tabla de SQL Server - Rendimiento 3

Resultado final:

SQL Server - Find MAX value from multiple columns in a SQL Server table - Performance
SQL Server: busque el valor MAX de varias columnas en una tabla de SQL Server - Rendimiento

Como podemos ver, la solución 1, además de ser muy pequeña, es la de mayor rendimiento.

¡Gracias por visitarnos!

Valor más grande del servidor SQL de varias columnas en una consulta de vista de tabla Encuentre el valor MÁXIMO de varias columnas en una tabla de SQL Server

Valor más grande del servidor SQL de varias columnas en una consulta de vista de tabla Encuentre el valor MÁXIMO de varias columnas en una tabla de SQL Server