如何在SQL中获取上一个和最新日期及其详细信息

时间:2015-10-22 14:15:02

标签: sql oracle

我有一张包含以下数据的表格:

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

3 个答案:

答案 0 :(得分:2)

我假设您想要一个独特的accountbookid组合的数据。

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