2015-10-22 3 views
5

Mam tabelę z następującymi danymi:Jak zdobyć poprzedni i ostatnią datę i swoje dane w SQL

create table tempdata(account varchar2(20)not null,bookid number(10),seqno number(20) not null,book_date date, book1 number(10), 
book2 number(10),book3 number(10)) 

insert into tempdata values('123',101,09,add_months((sysdate),-1),100,120,130); 

insert into tempdata values('123',101,10,sysdate),70,60,100) 

select * from tempdata; 

ACCOUNT BOOKID SEQNO BOOK_DATE    BOOK1 BOOK2 BOOK3 

123  101  9  9/22/2015 10:05:28 AM 100  120 130 

123  101  10  10/22/2015 10:01:42 AM 70  60  100 

muszę do wyjścia coś jak poniżej, aby stworzyć inną tabelę temp z najnowszych informacji księgowych w tym poprzednim terminie i najnowszej data:

ACCOUNT BOOKID SEQNO  Previous_DATE   Latest_date   BOOK1 BOOK2 BOOK3 

123  101  10 9/22/2015 10:05:28 AM 10/22/2015 10:01:42 AM   70  60  100 
+0

Dodany tag 'oracle' oparty na' sysdate', 'varchar2' i' add_months' –

+2

życzymy sobie, aby każdy OP w SO tworzył i wstawiał instrukcje wraz z wejściowymi i oczekiwanymi danymi wyjściowymi, takimi jak to pytanie. Sprawia, że ​​bardzo łatwo się bawić :) – Utsav

Odpowiedz

2

Oto jestem zakładając, że chcesz dane o niepowtarzalnym account i bookid kombinacji.

SELECT T1.ACCOUNT, T1.BOOKID, T1.SEQNO,T1.PREVIOUS_DATE, 
T1.BOOK_DATE AS LATEST_DATE , T1.BOOK1, T1.BOOK2, T1.BOOK3 
FROM (
    SELECT T.* ,ROW_NUMBER() OVER (PARTITION BY ACCOUNT,bookid ORDER BY BOOK_DATE desc) as rno, 
    LAG(TO_CHAR(BOOK_DATE), 1, 0) OVER (ORDER BY BOOK_DATE) AS PREVIOUS_DATE 
    FROM TEMPDATA T) T1 
WHERE T1.RNO =1 
0
SELECT ACCOUNT, 
BOOKID, 
MAX(SEQNO), 
(SELECT * 
FROM (SELECT BOOK_DATE, row_number() over (ORDER BY BOOK_DATE desc) AS row_num) t 
WHERE row_num = 2) AS Previous_DATE, 
MAX(BOOK_DATE) AS Latest_date, 
(SELECT a.BOOK1 
FROM tempdataa a 
WHERE a.BOOK_DATE = (SELECT MAX(BOOK_DATE) 
         FROM tempdata 
         WHERE ACCOUNT = a.ACCOUNT 
         AND BOOKID = a.BOOKID)) AS BOOK1, 
(SELECT a.BOOK2 
FROM tempdataa a 
WHERE a.BOOK_DATE = (SELECT MAX(BOOK_DATE) 
         FROM tempdata 
         WHERE ACCOUNT = a.ACCOUNT 
         AND BOOKID = a.BOOKID)) AS BOOK2, 
(SELECT a.BOOK3 
FROM tempdataa a 
WHERE a.BOOK_DATE = (SELECT MAX(BOOK_DATE) 
         FROM tempdata 
         WHERE ACCOUNT = a.ACCOUNT 
         AND BOOKID = a.BOOKID)) AS BOOK3 
FROM tempdata 
GROUP BY ACCOUNT, BOOKID 
+0

Dziękuję bardzo za pomoc –

1

LGD i row_number funkcje analityczne by się przydał tutaj:

select account, 
     bookid, 
     seqno, 
     previous_date, 
     latest_date, 
     book1, 
     book2, 
     book3 
from (select account, 
       bookid, 
       seqno, 
       lag(book_date) over (partition by account order by book_date) previous_date, 
       book_date latest_date, 
       book1, 
       book2, 
       book3, 
       row_number() over (partition by account order by book_date) rn 
     from tempdata) 
where rn = 1; 

ACCOUNT     BOOKID  SEQNO PREVIOUS_DATE   LATEST_DATE    BOOK1  BOOK2  BOOK3 
-------------------- ---------- ---------- --------------------- --------------------- ---------- ---------- ---------- 
123       101   9      22/09/2015 14:34:06   100  120  130 

nb Przyjąłem założenie, że chcesz te informacje dla każdego konta. Jeśli grupa musi zostać zmieniona (np. Może to konto i bookid lub po prostu bookid), musisz odpowiednio zmienić klauzule partycji.

Powiązane problemy