Sql 是否查询拉取客户对应的上一个订单日期?

Sql 是否查询拉取客户对应的上一个订单日期?,sql,join,reporting,self-join,cognos-bi,Sql,Join,Reporting,Self Join,Cognos Bi,我有一个带有客户表和订单表的模式。客户可以在多个日期下订单。我需要为每个客户对应的订单日期指定以前的订单日期 假设一个客户下了4个订单,那么对于最新订单第4个订单-它必须拉取当前订单日期和以前的订单日期第3个订单。对于客户下的第三个订单,它必须将第三个订单日期作为当前订单日期,并将上一个订单日期作为第二个订单日期,依此类推 我正在使用下面的查询获取以前的订单日期,然后与当前的查询结合以获取结果: select customerid, orderid, order_date as previous

我有一个带有客户表和订单表的模式。客户可以在多个日期下订单。我需要为每个客户对应的订单日期指定以前的订单日期

假设一个客户下了4个订单,那么对于最新订单第4个订单-它必须拉取当前订单日期和以前的订单日期第3个订单。对于客户下的第三个订单,它必须将第三个订单日期作为当前订单日期,并将上一个订单日期作为第二个订单日期,依此类推

我正在使用下面的查询获取以前的订单日期,然后与当前的查询结合以获取结果:

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
但问题是,我得到的是一个与customerid相对应的单一日期,而要求是-只是与客户当前订单日期相对应的上一个订单日期

任何建议都会有帮助!谢谢

请根据客户ID尝试使用滞后窗口功能:

对于每个客户的最早订单,上次订单日期将为空

示例结果不介意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.orderid添加到PARTITION BY子句。

不幸的是,在SQL节点中用于报告目的时,LAG不起作用。我尝试使用下面的查询,并得到了理想的结果:

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
好发现!说明:由于这些函数可以在不进行自联接的情况下同时访问表中的多行,因此可以提高处理速度。滞后功能提供对当前位置之前给定偏移处的行的访问,超前功能提供对当前位置之后给定偏移处的行的访问。
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