2015-10-22 10 views
5

ho una tabella con i seguenti dati:Come ottenere la data precedente e tutti i vantaggi ed i suoi dettagli in 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 

ho bisogno di qualcosa di output come il seguente, al fine di creare un'altra tabella temporanea con gli ultimi dettagli del libro tra cui la data precedente e ultima 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

Aggiunto il tag 'oracle' basato su' sysdate', 'varchar2' e' add_months' –

+2

desiderano che ogni OP in SO fornisca queste istruzioni di creazione e inserimento insieme a input e output previsto, come questa domanda. Rende molto facile da giocare :) – Utsav

risposta

2

Qui io parto dal presupposto che si desidera i dati per una combinazione unica account e bookid.

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

Grazie mille per il tuo aiuto –

1

Le funzioni analitiche GAL e row_number sarebbe venuto in aiuto qui:

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 

N.B. Ho ipotizzato che tu voglia queste informazioni per ogni account. Se è necessario modificare il raggruppamento (ad esempio, se si tratta di account e bookid o solo bookid), è necessario modificare opportunamente la partizione in base alle clausole.

Problemi correlati