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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
IF ( OBJECT_ID('tempdb..##Teste') IS NOT NULL ) DROP TABLE ##Teste CREATE TABLE ##Teste ( ID INT IDENTITY(1, 1) PRIMARY KEY, Name 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 ( Name, 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 |
Solução 1 – Utilizando VALUES
1 2 3 4 5 6 7 8 |
SELECT ID, ( SELECT MAX(UltimoAcesso) FROM (VALUES (Data1),(Data2),(Data3)) AS UltimoAcesso(UltimoAcesso) ) AS UltimoAcesso FROM ##Teste |
Solução 2 – Utilizando UNPIVOT
1 2 3 4 5 6 7 8 9 |
SELECT ID, MAX(UltimoAcesso) AS UltimoAcesso FROM ##Teste UNPIVOT ( UltimoAcesso FOR DateVal IN ( Data1, Data2, Data3 ) ) AS u GROUP BY ID, Name |
Solução 3 – Utilizando UNION
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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:
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
Estou tentando buscar a maior data de serviços na tabela OrdemServicos.
Já fiz vários teste e não consigo fazer funcionar.
Selecionar todos clientes, com a maior data na tabela OrdemServicos.
Projeto php com bd firebird.
Muito Bom e útil!
Obrigado pelo feedback, Jefferson!
Parabéns pelo post, muito didático
Excelente dica, salvou horas de trabalho. ?