Fórum Penúltimo registro no SQL #265678
17/01/2005
0
select * from tabela
where valor = (select max (valor)
from tabela
where campo = 2)
Esse select me retorna o maior valor de campo.
A dúvida e, qual a função no sql server me retorna o penúltimo valor?
Ex: valor = 1,2,3,4,5
Queria que me retorna-se 4, que no caso é o penúltimo valor. :roll:
Mssilva
Curtir tópico
+ 0Posts
17/01/2005
Mr Razor
query.prior;//volta 1 registro
vc estara no penultimo registro. :twisted:
Gostei + 0
17/01/2005
Mssilva
Tenho uma tabela que guarda o preço de um produto ex: passagens essas passagens sofrem aumento + ou – uma vez por ano só que são vendidos todos os dias e quanto um cliente vem trocar uma passagem por ter aumentado e gerado um relatório de trocas, esse relatório tem de ser calculado pelo penúltimo preço (Ou seja o valor anterior ao aumento) é isso que estou precisando é, no SQL Server 2000 mesmo pois faço as consulta no Query Analyzar e jogo no Delphi 7
Espero ter sido claro.
Obrigado,
Se poder me ajudar fico no aguarde.
Gostei + 0
17/01/2005
Vinicius2k
Vc pode fazer isso com a cláusula TOP, um sub-select com MAX e ordenção descendente :
select top 1 * from TABELA where (CAMPO < (select max(CAMPO) from TABELA)) order by CAMPO desc
Devem existir outras formas, mas esta foi a primeira que me veio em mente. Também estou supondo que o último valor seja sempre maior que o penúltimo, mas creio que o caminho seja este...
Espero ter ajudado...
T+
Gostei + 0
18/01/2005
Mssilva
data(datetime), tipo(tinyint) e valor(money).
Se poder me ajudar.
Gostei + 0
18/01/2005
Btovix
Gostei + 0
18/01/2005
Paulo_amorim
Creio que a SQL do Vinicius possa não ter funcionado por um detalhe...
tente assim:
SELECT TOP 1 * FROM( SELECT * from TABELA where CAMPO < (select max(CAMPO) from TABELA) order by CAMPO desc )
Espero que ajude
Até+
Gostei + 0
18/01/2005
Vinicius2k
Veja bem, a instrução que lhe passei é ´simples´, ou seja, não está adaptada dentro do seu contexto real... podem existir outros detalhes a serem aplicados...
Vc tem algo mais na cláusula WHERE ? Vc deve ficar atento ao fato de que se vc tiver uma condição para a select principal, a mesma condição deve existir para a sub-select...
Entenda a lógica :
A tabela :
DATA TIPO VALOR ---------- ---- --------- 01/01/2005 1 1.000,00 02/01/2005 2 2.000,00 03/01/2005 1 3.000,00 04/01/2005 2 4.000,00 05/01/2005 1 5.000,00
Possíveis selects e os retornos :
1.
select top 1 * from TABELA where VALOR < (select max(VALOR) from TABELA) order by VALOR desc DATA TIPO VALOR ---------- ---- --------- 04/01/2005 2 4.000,00
2.
select top 1 * from TABELA where (TIPO = 2) and (VALOR < (select max(VALOR) from TABELA where TIPO = 2)) order by VALOR desc DATA TIPO VALOR ---------- ---- --------- 02/01/2005 2 2.000,00
3.
select top 1 * from TABELA where (TIPO = 1) and (VALOR < (select max(VALOR) from TABELA where TIPO = 1)) order by VALOR desc DATA TIPO VALOR ---------- ---- --------- 03/01/2005 1 3.000,00
Analise estes pontos...
T+
Gostei + 0
18/01/2005
Mssilva
declare @data char(10)
set @data = ´18/08/2001´
select top 1 valor ,data
from
tabela
where
(valor < (select max(valor)
from tabela))
and (data <= (select max(convert(datetime, convert(char(10), @data,103), 103)) + 1
from tabela))
and tipo = 2
group by data, valor
order by valor desc
É exatamente o que estou precisando curtíssimo.
Valeu galera.
Há btovix data é o campo chave desculpe não ter informado isso
Vinicius os seus 3 select acima funcionaram más para minha realidade só funciona se for como fiz más sem sua idéia não teria conseguido.
Obrigado a todos. :lol:
Gostei + 0
18/01/2005
Mssilva
declare @data char(10)
set @data = ´18/08/2001´
select top 1 valor ,data
from
tabela
where
(valor < (select max(valor)
from tabela))
and (data <= (select max(convert(datetime, convert(char(10), @data,103), 103)) + 1
from tabela))
and tipo = 2
group by data, valor
order by valor desc
É exatamente o que estou precisando curtíssimo.
Valeu galera.
Há btovix data é o campo chave desculpe não ter informado isso
Vinicius os seus 3 select acima funcionaram más para minha realidade só funciona se for como fiz más sem sua idéia não teria conseguido.
Obrigado a todos. :lol:
Gostei + 0
13/07/2022
Thiago
select * from tabela
where valor = (select max (valor)
from tabela
where campo = 2)
Esse select me retorna o maior valor de campo.
A dúvida e, qual a função no sql server me retorna o penúltimo valor?
Ex: valor = 1,2,3,4,5
Queria que me retorna-se 4, que no caso é o penúltimo valor. :roll:
Uma maneira interessante de resolver esse problema é usando a função nativa do SQL RANK()
Ver topico em : https://docs.microsoft.com/pt-br/sql/t-sql/functions/rank-transact-sql?view=sql-server-ver16
Existem outras funções de classificação que podem ser usadas para solucionar esse caso.
Outro ponto importante a destacar é que as estratégias usando top limitem a último, primeiro, segundo ou penúltimo, mas e se caso queira saber o antepenúltimo, ou mesmo 10º de um lista ordenada...
Assim você poderia usar a seguinte estratégia:
Select * From ( SELECT * ,RANK() OVER (ORDER BY campoaserranqueado DESC) AS Rank FROM #temp ) t where t.Rank = 2 /*Penúltimo*/
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)