2015-10-22 5 views
5

में अपनी जानकारी पाने के लिए मैं कैसे निम्न डेटा के साथ एक मेज है:पिछले और नवीनतम तारीख और 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 

मैं आदेश नवीनतम पुस्तक के विवरण के साथ एक और अस्थायी तालिका बनाने के लिए में निम्नलिखित की तरह उत्पादन कुछ करने की जरूरत है

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

'sysdate', 'varchar2' और' add_months' –

+2

पर आधारित' ऑरैकल 'टैग जोड़ा गया है, इसलिए इन ओपी में प्रत्येक ओपी की इच्छा है और इन प्रश्नों की तरह इनपुट और अपेक्षित आउटपुट के साथ इन बयान डालें। चारों ओर खेलने के लिए बहुत आसान बनाता है :) – Utsav

उत्तर

2

यहाँ मैं यह सोचते हैं कि आप एक अद्वितीय account और 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

आपकी मदद के लिए बहुत बहुत धन्यवाद –

1

अंतराल और ROW_NUMBER विश्लेषणात्मक कार्यों यहाँ काम में आएगा:

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. मैंने धारणा की है कि आप प्रत्येक खाते के लिए यह जानकारी चाहते हैं। यदि समूह को बदलने की जरूरत है (उदाहरण के लिए हो सकता है कि यह खाता और बुकिड, या सिर्फ बुकिड हो) तो आपको विभाजन को उचित रूप से खंड में संशोधन करने की आवश्यकता होगी।

संबंधित मुद्दे