2015-10-22 11 views
5

Tôi có một bảng với các dữ liệu sau:Làm thế nào để có được ngày trước và mới nhất và thông tin chi tiết của nó trong 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 

tôi cần một cái gì đó đầu ra như sau để tạo một bảng tạm thời với các chi tiết cuốn sách mới nhất bao gồm ngày trước và ngày mới nhất:

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

Đã thêm thẻ 'oracle' dựa trên' sysdate', 'varchar2' và' add_months' –

+2

muốn mọi OP trong SO cung cấp các câu lệnh tạo và chèn cùng với đầu vào và đầu ra dự kiến, như câu hỏi này. Làm cho rất dễ dàng để chơi xung quanh :) – Utsav

Trả lời

2

Ở đây tôi giả định rằng bạn muốn dữ liệu cho một độc đáo accountbookid kết hợp.

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

Cảm ơn bạn rất nhiều vì đã giúp đỡ của bạn –

1

Các chức năng phân tích LAG và ROW_NUMBER sẽ có ích ở đây:

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. Tôi đã giả định rằng bạn muốn thông tin này cho mỗi tài khoản. Nếu nhóm cần phải được thay đổi (ví dụ: có thể đó là tài khoản và bookid, hoặc chỉ bookid) thì bạn sẽ cần phải sửa đổi phân vùng theo các điều khoản thích hợp.

Các vấn đề liên quan