2016-08-02 20 views
1

我有一個架構與客戶表和訂單表。客戶可以在多個日期下訂單。對於與客戶相對應的每個order_date,我需要先前的order_date。查詢拉取與客戶相對應的上一個訂單日期?

說一個客戶下了4個訂單,然後對於最新訂單(第4個訂單) - 它必須提取當前訂單日期和上一個訂單日期(第3個訂單)。對於客戶發出的第三個訂單,它必須將第三個order_date作爲當前的order_date和先前的order_date(第二個訂單),依此類推。

我使用下面的查詢來獲取先前order_date的,然後用current_query加盟即可導致::

select customerid, orderid, order_date as previous_order_date 
from (
    select c.customerid, o.orderid, o.order_date, 
     row_number() over (partition by c.customerid, o.orderid 
          order by o.order_date) rown 
    from customers c join orders o on c.customerid = o.customerid 
     ) a 
where rown = 2 

但問題是,我得到相應的客戶ID,而要求是一個日期 - 就是前一個order_date,對應於客戶的當前order_date。

任何建議都會有幫助!由於

回答

2

嘗試LAG()窗函數每customerid

select 
    c.customerid, o.orderid, o.order_date, 
    lag(o.order_date) over (partition by c.customerid order by o.order_date) AS prev_order_date 
from customers c 
join orders o on c.customerid = o.customerid 

爲每一位客戶prev_order_date的最早次序將是無效的。

樣品結果(不介意的OrderID,它只是一個例子):

customerid | orderid | order_date | prev_order_date 
------------+---------+------------+----------------- 
      1 |  6 | 2015-02-08 | 
      1 |  2 | 2016-02-05 | 2015-02-08 
      1 |  3 | 2016-02-08 | 2016-02-05 
      1 |  1 | 2016-03-05 | 2016-02-08 
      2 |  5 | 2016-07-01 | 
      2 |  4 | 2016-07-08 | 2016-07-01 

如果一個客戶可以放置不同的日期內,以相同的順序(怪異,但是這似乎是你的情況下)增加o.orderidPARTITION BY條款。

+1

好找!說明:http://docs.oracle.com/database/121/DWHSG/analysis.htm#CHDCBCGF 「因爲這些函數在沒有自聯接的情況下同時訪問多個表的一行,所以它們可以提高處理速度LAG函數提供在當前位置之前的給定偏移量處的行,並且LEAD函數提供在當前位置之後的給定偏移量處訪問行。 –

0

不幸的是,LAG()在SQL節點中用於報告目的時不起作用。我嘗試使用下面的查詢,並得到了預期的結果:

SELECT c.customer_code, o.customer_sid, o.order_id, o.order_no, 
     o.order_created_date, 
     (SELECT MAX (o1.order_created_date) 
      FROM d_customer c1 LEFT JOIN f_order o1 
       ON c1.customer_sid = 
            o1.customer_sid 
      WHERE c1.customer_sid = c.customer_sid 
      AND o1.order_created_date < o.order_created_date 
      AND EXISTS (SELECT 1 
          FROM f_invoice i 
          WHERE i.order_id = o1.order_id)) 
                AS prev_order_created_date, 
     t.financial_year, t.financial_month_no 
    FROM d_customer c JOIN f_order o 
     ON c.customer_sid = o.customer_sid 
     AND c.customer_type = 'PATIENT' 
     AND c.customer_country = 'UNITED STATES' 
     AND o.customer_type = 'PATIENT' 
     AND o.bill_to_country = 'UNITED STATES' 
     AND o.order_status = 'SHIPPED' 
     AND o.order_type = 'SALES' 
     AND o.order_group = 'REVENUE' 
    -- AND c.customer_code = '233379PT' 
     LEFT JOIN d_time t ON t.time_sid = o.order_created_date_sid 
ORDER BY order_created_date DESC 
相關問題