我有一张包含以下数据的表格:
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 :(得分: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
答案 1 :(得分:1)
LAG和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。我假设您希望每个帐户都有此信息。如果需要更改分组(例如,可能是帐户和bookid,或者只是bookid),那么您需要适当地修改分区。
答案 2 :(得分: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