Pegar linha anterior

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
cleberz
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 107
Registrado em: Ter, 15 Nov 2011 8:42 am

Bom dia senhores. Como eu faço para pegar em uma tabela o registro anterior?

ex:

Selecionar tudo

STRT_DT    END_DT
---------    --------
26/10/16    30/12/16
01/11/16    01/11/16
02/11/16    30/12/16
23/11/16    23/11/16
A SEGUNDA LINHA ESTA ERRADA porque O CAMPO STRT_DT(01/11/16) É MENOR DO QUE O CAMPO END_DT(30/12/16) DA PRIMEIRA LINHA.
Aí preciso pegar a linha anterior de STRT_DT(01/11/16)

A ULTIMA LINHA ESTA ERRADA porque O CAMPO STRT(23/11/16) É MENOR DO QUE O CAMPO END_DT(30/12/16) DA PENULTIMA LINHA.
Aí preciso pegar a linha anterior de STRT(23/11/16)
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Bom dia,

Essa é uma tabela com vigências e você precisa pegar as inconsistências?
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5023
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

É possível usar funções analíticas pra buscar a linha anterior.

Por exemplo: (neste caso, agrupando por departamento)

Selecionar tudo

select hiredate
, LAG(hiredate,1,NULL)
  OVER (PARTITION BY deptno
        ORDER BY hiredate, ename) 
From EMP;

Selecionar tudo

DEPTNO ENAME      HIREDATE    LAG(HIREDATE,1,NULL)OVER(PARTI
------ ---------- ----------- ------------------------------
    10 CLARK      6/9/1981    
    10 KING       11/17/1981  6/9/1981
    10 MILLER     1/23/1982   11/17/1981
    20 SMITH      12/17/1980  
    20 JONES      4/2/1981    12/17/1980
    20 FORD       12/3/1981   4/2/1981
    20 SCOTT      4/19/1987   12/3/1981
    20 ADAMS      5/23/1987   4/19/1987
    30 ALLEN      2/20/1981   
    30 WARD       2/22/1981   2/20/1981
    30 BLAKE      5/1/1981    2/22/1981
    30 TURNER     9/8/1981    5/1/1981
    30 MARTIN     9/28/1981   9/8/1981
    30 JAMES      12/3/1981   9/28/1981

14 rows selected

Ou também tem como fazer a tabela toda: (sem agrupamento)

Selecionar tudo

select hiredate
, LAG(hiredate,1,NULL)
  OVER (PARTITION BY NULL
        ORDER BY hiredate, ename) 
From EMP;

Selecionar tudo

HIREDATE    LAG(HIREDATE,1,NULL)OVER(PARTI
----------- ------------------------------
12/17/1980  
2/20/1981   12/17/1980
2/22/1981   2/20/1981
4/2/1981    2/22/1981
5/1/1981    4/2/1981
6/9/1981    5/1/1981
9/8/1981    6/9/1981
9/28/1981   9/8/1981
11/17/1981  9/28/1981
12/3/1981   11/17/1981
12/3/1981   12/3/1981
1/23/1982   12/3/1981
4/19/1987   1/23/1982
5/23/1987   4/19/1987
Veja esse texto com diversos exemplos de funções analíticas:
https://glufke.net/oracle/download/funco ... TICAS.html
:-o
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 4 visitantes