SQL PARA RETORNAR PENULTIMO REGISTRO MAIOR
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
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
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.
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.
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.



Faça o select que desejar. mova para o ultimo registro (Move Last), depois é só usar uma comando Move Previuos.




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
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.
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.

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;
Você pode estar fazendo assim
Mas a estrutura do nosso amigo FFCOUTO também foi excelente, um pouco mais rápida. Fiz assim a estrutura dele
Espero ter ajudado
--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
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
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
Dá sim!
Eu especifiquei o cliente para que não mostre muitos registros mas você pode fazer assim!
Não testei, mas caso dê algum erro me avise que vejo pra você
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ê
Filman,
Ajustei a sua string, pois há duplicação de dados.
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;
de fato esqueci de colocar um group by
FLW
FLW
Tópico encerrado , respostas não são mais permitidas