Penúltimo registro no SQL

Delphi

17/01/2005

Colega tem essa consulta
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

Mssilva

Curtidas 0

Respostas

Mr Razor

Mr Razor

17/01/2005

Query.last;//vai para o ultimo
query.prior;//volta 1 registro

vc estara no penultimo registro. :twisted:


GOSTEI 0
Mssilva

Mssilva

17/01/2005

Desculpe colega más eu não foi claro.
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
Vinicius2k

Vinicius2k

17/01/2005

Colega,

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
Mssilva

Mssilva

17/01/2005

Colega desculpe a demora para responder más, não deu certo tenho 5 valores no campo e fazendo como você sugeriu a consulta me traz o último valor se usar asc me traz o primeiro os campos são:
data(datetime), tipo(tinyint) e valor(money).
Se poder me ajudar.


GOSTEI 0
Btovix

Btovix

17/01/2005

olá... acho que se vc usar a mesma consulta acima com a chave primária ao invés do campo vai dar certo... epero que tenha ajudado


GOSTEI 0
Paulo_amorim

Paulo_amorim

17/01/2005

Olá

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
Vinicius2k

Vinicius2k

17/01/2005

Colega,

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
Mssilva

Mssilva

17/01/2005

Colegas obrigado pela ajuda principalmente ou Vinicius, pois sua idéia de ontem me abril a mente para esse select:


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
Mssilva

Mssilva

17/01/2005

Colegas obrigado pela ajuda principalmente ou Vinicius, pois sua idéia de ontem me abril a mente para esse select:


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
Thiago

Thiago

17/01/2005

Colega tem essa consulta
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
POSTAR