2016-08-02 19 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 
相关问题