SQL PARA RETORNAR PENULTIMO REGISTRO MAIOR

MICHAELL 04/07/2014 14:47:53
#439354
Galera, preciso da ajuda de voces.. tentei de todas as formas, mas nao consegui.
Consultei o sr. google e tambem nao encontrei nada.

queria apenas um comando SQL no qual me retornasse o penultimo registro maior.
por exemplo, se eu usar o comando MAX(Data) vai me retornar a maior data do banco, certo?
mas e se eu quiser o penultimo registro maior ? tem algum comando pra isso?

cheguei a tentar e até encontrar no google a seguinte solucao
max(data -1)

mas fazendo o teste isso apenas vai pegar a data maior e diminuir um dia.

nesse projeto utilizo Access

se poderem me ajudar, agradeço muito
valew
TUNUSAT 04/07/2014 15:08:26
#439355
MAICONJG,

Tenho uma idéia (mas não experimente para ver se funciona):

1º) Faça um [Ô]Select[Ô] para retornar somente 2 registros (Top 2);
2º) Coloque [Ô]Order by[Ô] do Menor para o Maior usando [Ô]Data[Ô].

3º) Na hora de ler o [Ô]recordset[Ô] pegue somente o primeiro registro.
OU
3º) Faça uma [Ô]SubSelect[Ô] dentro desta Select para ler o MIN dos dois registros.


[][ô]s,
Tunusat.
ROBSON 05/07/2014 20:36:31
#439359
Se usa o Access é simples pois tem o [ô]ponteiro[ô].
Faça o select que desejar. mova para o ultimo registro (Move Last), depois é só usar uma comando Move Previuos.

FILMAN 05/07/2014 21:58:18
#439360
SELECT MAX(A.DATA)
FROM TABELA A
WHERE A.DATA < (SELECT MAX(B.DATA) FROM TABELA B WHERE B.CLIENTE = 1)
AND A.CLIENTE = 1



Na clausula WHERE coloquei o código do cliente caso necessite, mas não é necessário se a tabela for sem paramêtros.


Espero ter ajudado
MICHAELL 06/07/2014 11:25:31
#439363
bom, esqueci de falar, que queria o ultimo e o penultimo registro na mesma consulta.
para carregar os dados em um grid mais rapidamente.

hoje faco isso utilizando os ponteiros, mas fica muito lento..
pois preciso exibir ultima e penultima compra de todos os clientes do banco.

dependendo de cada empresa, tem sistemas com mais de 60mil clientes cadastrados.

FFCOUTO 06/07/2014 21:05:23
#439367
Tente este sql:

SELECT MAX(data) AS ultimo, MIN(data) AS penultimo FROM
(SELECT TOP 2 data FROM tabela GROUP BY data ORDER BY data DESC) AS temp;


FILMAN 07/07/2014 13:07:01
#439386
Você pode estar fazendo assim

--Em uma tabela de 1,5 milhões de registro me retornou em 11,7 segundos (Primeira Execução)
--Após gravado em cache a estrutura SQL me retornou em 6,4 segundos
--Tabela criado com os seus devidos índices. O campo DATA esta incluso no indice
SELECT MAX(T.ULTIMA_DATA) AS ULTIMO, MAX(A.DATA) AS PENULTIMO
FROM TABELA A, (SELECT MAX(B.DATA) AS ULTIMA_DATA FROM TABELA B WHERE B.CLIENTE = 123456) T
WHERE A.DATA < (SELECT MAX(C.DATA) FROM TABELA C WHERE C.CLIENTE = 123456)
AND A.CLIENTE = 123456;


Mas a estrutura do nosso amigo FFCOUTO também foi excelente, um pouco mais rápida. Fiz assim a estrutura dele

--Em uma tabela de 1,5 milhões de registro me retornou em 9,4 segundos (Primeira Execução)
--Após gravado em cache a estrutura SQL me retornou em 4,8 segundos
--Tabela criado com os seus devidos índices. O campo DATA esta incluso no indice
SELECT MAX(T.DATA) AS ULTIMO, MIN(T.DATA) AS PENULTIMO
FROM (
SELECT DISTINCT TOP 2 B.DATA
FROM TABELA B
WHERE B.CLIENTE = 123456
ORDER BY DATA DESC
) T;



Espero ter ajudado
MICHAELL 07/07/2014 14:33:56
#439393
opa... que beleza, valew mesmo, realmente funciona.. mas apenas para um cliente especifico
caso eu queria uma listagem de clientes, com a penultima e ultima data... ja nao daria certo

exemplo

nome cliente | ultima_data | penultima data
cliente a | 01/05/2014 | 05/05/2014
cliente b | 10/05/2014 | 11/05/2014
cliente c | 08/05/2014 | 15/05/2014


vou ver se consigo adaptar
FILMAN 07/07/2014 20:39:04
#439407
Dá sim!

Eu especifiquei o cliente para que não mostre muitos registros mas você pode fazer assim!

SELECT 
A.CLIENTE,
(SELECT MAX(B.DATA)
FROM TABELA B
WHERE B.CLIENTE = A.CLIENTE
) AS ULTIMA_DATA,
(SELECT MAX(C.DATA)
FROM TABELA C
WHERE C.CLIENTE = A.CLIENTE
AND C.DATA < (SELECT MAX(D.DATA) FROM TABELA D WHERE D.CLIENTE = C.CLIENTE)
) AS PENULTIMA_DATA
FROM TABELA A
ORDER BY A.CLIENTE


Não testei, mas caso dê algum erro me avise que vejo pra você
FFCOUTO 08/07/2014 09:53:56
#439411
Filman,

Ajustei a sua string, pois há duplicação de dados.

SELECT DISTINCT cliente,
(SELECT MAX(b.data) FROM tabela b WHERE (b.cliente = a.cliente)) AS ultimo,
(SELECT MIN(c.data) FROM (SELECT TOP 2 data FROM tabela d WHERE (d.cliente = a.cliente) ORDER BY data DESC) AS c) AS penultimo
FROM tabela a
ORDER BY cliente;


FILMAN 08/07/2014 10:52:30
#439413
de fato esqueci de colocar um group by

FLW
Página 1 de 2 [14 registro(s)]
Tópico encerrado , respostas não são mais permitidas