Plsql 从上一行获取值

Plsql 从上一行获取值,plsql,Plsql,我试图从前一行中获取值,然后将其添加到当前行中的值中,以便于报告 该报告的目的是查看一天中在下午5点之前完成并在晚上10点之前发货的订单总数, 下午5点之后订购的任何订单都需要添加到第二天,但任何不符合下午5点之前10点之前标准的订单也将添加到第二天的订单总数中 SELECT SUB1."DATE", COUNT(SUB1."ORDER_ID") AS "TOTAL", SUM(SUB1."SAME_DAY")

我试图从前一行中获取值,然后将其添加到当前行中的值中,以便于报告

该报告的目的是查看一天中在下午5点之前完成并在晚上10点之前发货的订单总数, 下午5点之后订购的任何订单都需要添加到第二天,但任何不符合下午5点之前10点之前标准的订单也将添加到第二天的订单总数中

SELECT SUB1."DATE",
  COUNT(SUB1."ORDER_ID")                   AS "TOTAL",
  SUM(SUB1."SAME_DAY")                     AS "SAME_DAY",
  (COUNT(SUB1."ORDER_ID") - SUM(SUB1.SAME_DAY)) AS "CARRIED_FORWARD",
  SUM(SUB1."AFTER_5"),
  SUM(SUB1."AFTER_5_CF"),
  SUM(SUB1."SAME_DAY1_CF")
FROM
  (SELECT TO_CHAR(ORDER_DATE, 'DD/MM/YYYY') AS "DATE",
    ORDER_ID,
    CASE
      WHEN TO_CHAR(ORDER_DATE, 'DD/MM/YYYY') = TO_CHAR(SHIPPED_DATE,'DD/MM/YYYY')
      AND TO_CHAR(ORDER_DATE, 'HH24')        < 17
      AND TO_CHAR(SHIPPED_DATE, 'HH24')      < 22
      THEN 1
      ELSE 0
    END AS "SAME_DAY",
    CASE
      WHEN TO_CHAR(ORDER_DATE, 'HH24') >= 17
      THEN 1
      ELSE 0
    END AS "AFTER_5",
    CASE
      WHEN TO_CHAR(ORDER_DATE , 'DD-MM-YYYY') = TO_CHAR(SHIPPED_DATE - 1, 'DD-MM-YYYY')
      AND TO_CHAR(ORDER_DATE , 'HH24')        >= 17
      AND TO_CHAR(SHIPPED_DATE, 'HH24')       < 22
      THEN 1
      ELSE 0
    END AS "AFTER_5_CF",
    CASE
      WHEN TO_CHAR(ORDER_DATE , 'DD-MM-YYYY') = TO_CHAR(SHIPPED_DATE - 1, 'DD-MM-YYYY')
      AND TO_CHAR(ORDER_DATE , 'HH24')        < 17
      AND TO_CHAR(SHIPPED_DATE, 'HH24')       < 22
      THEN 1
      ELSE 0
    END AS "SAME_DAY1_CF"
  FROM ORDER_HEADER
  WHERE ORDER_DATE BETWEEN TO_TIMESTAMP('2019-11-07', 'YYYY-MM-DD') AND TO_TIMESTAMP('2019-11-13', 'YYYY-MM-DD')
  )SUB1
GROUP BY SUB1."DATE"
上面的代码为我提供了所需的一切,但总计应为总计+结转+5后,当天应为当天+5后CF+当天1 CF

我试着利用LAG来给它上一个日期,但我不确定我是否正确地使用了它,如果没有办法做到这一点,并在一行上显示信息,那就好了


如果我能做到这一点,那么我应该能够处理周五,周六和周日,因为他们的结转需要添加到周一后

听起来您需要一个window子句来动态地回望一定数量的行。语法大致如下:

SUM(some_col) over ( order by col range between nn preceding and nn following)
这允许当前行根据特定范围的大小进行回溯或向前,例如回溯3天和展望1天等。在您的情况下,您希望根据当前数据动态更改该金额,即,大多数日期我们回溯一天,但对于周一,我们也希望在周末进行回溯

您可以通过在window子句中调用函数来控制它来实现这一点。巧合的是,我做了一个教程,作为窗口函数SQL系列的一部分,完全涵盖了这个场景。你可以在这里观看演示


滞后确实是你所追求的。请编辑您的问题,以添加示例数据和您试图获得的预期输出。我有一个可行的解决方案,但它包括我只能描述为时髦sql的内容。一旦我有更多的时间,我将考虑实施您的解决方案,因为它将更容易管理。