Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有条件地执行滞后的最大和最小计算-Oracle SQL_Sql_Oracle_Aggregate Functions_Lag - Fatal编程技术网

有条件地执行滞后的最大和最小计算-Oracle SQL

有条件地执行滞后的最大和最小计算-Oracle SQL,sql,oracle,aggregate-functions,lag,Sql,Oracle,Aggregate Functions,Lag,我有这样一个数据表: | Order | Step | StepStart | StepEnd | ProcessCode | |:---------:|:----:|:---------:|:---------:|:-----------:| | 103502090 | 6900 | 2-Jan-19 | 2-Jan-19 | START | | 103502090 | 6900 | 1/2/2019 | 1/2/2019 | END | | 1

我有这样一个数据表:

|   Order   | Step | StepStart |  StepEnd  | ProcessCode |
|:---------:|:----:|:---------:|:---------:|:-----------:|
| 103502090 | 6900 |  2-Jan-19 |  2-Jan-19 |    START    |
| 103502090 | 6900 |  1/2/2019 |  1/2/2019 |     END     |
| 103502090 | 6950 |  2-Jan-19 |  2-Jan-19 |    START    |
| 103502090 | 6950 |  2-Jan-19 |  2-Jan-19 |     END     |
| 103502090 | 7000 |  3-Jan-19 |  3-Jan-19 |    START    |
| 103502090 | 7000 |  3-Jan-19 |  3-Jan-19 |     END     |
| 103502090 | 7050 |  4-Jan-19 |  4-Jan-19 |    START    |
| 103502090 | 7050 |  4-Jan-19 |  4-Jan-19 |     END     |
| 103502090 | 7100 |  8-Jan-19 |  8-Jan-19 |    START    |
| 103502090 | 7100 |  8-Jan-19 |  8-Jan-19 |     END     |
| 103502090 | 7200 |  9-Jan-19 |  9-Jan-19 |    START    |
| 103502090 | 7200 |  9-Jan-19 |  9-Jan-19 |     END     |
| 103502090 | 7300 |  9-Jan-19 |  9-Jan-19 |    START    |
| 103502090 | 7300 |  9-Jan-19 |  9-Jan-19 |     END     |
| 103502090 | 7400 |  9-Jan-19 |  9-Jan-19 |    START    |
| 103502090 | 7400 |  9-Jan-19 |  9-Jan-19 |   PROCESS   |
| 103502090 | 7400 |  9-Jan-19 |  9-Jan-19 |    START    |
| 103502090 | 7400 |  9-Jan-19 |  9-Jan-19 |     END     |
| 103502090 | 7450 | 10-Jan-19 | 10-Jan-19 |    START    |
| 103502090 | 7450 | 10-Jan-19 | 10-Jan-19 |   PROCESS   |
| 103502090 | 7450 | 10-Jan-19 | 14-Jan-19 |    START    |
| 103502090 | 7450 | 10-Jan-19 | 14-Jan-19 |   PROCESS   |
| 103502090 | 7450 | 10-Jan-19 | 14-Jan-19 |    START    |
| 103502090 | 7450 | 10-Jan-19 | 14-Jan-19 |     END     |
| 103502090 | 7550 | 14-Jan-19 | 14-Jan-19 |    START    |
| 103502090 | 7550 | 14-Jan-19 | 14-Jan-19 |     END     |
| 103502090 | 7700 | 16-Jan-19 | 16-Jan-19 |    START    |
| 103502090 | 7700 | 16-Jan-19 | 16-Jan-19 |     END     |
| 103502090 | 7750 | 17-Jan-19 | 17-Jan-19 |    START    |
| 103502090 | 7750 | 17-Jan-19 | 17-Jan-19 |     END     |
| 103561375 | 7450 |  4-Jan-19 |  4-Jan-19 |    START    |
| 103561375 | 7450 |  4-Jan-19 |  4-Jan-19 |   PROCESS   |
| 103561375 | 7450 |  4-Jan-19 |  8-Jan-19 |    START    |
| 103561375 | 7450 |  4-Jan-19 |  8-Jan-19 |   PROCESS   |
| 103561375 | 7450 |  4-Jan-19 |  8-Jan-19 |    START    |
| 103561375 | 7450 |  4-Jan-19 |  8-Jan-19 |     END     |
| 103561375 | 7550 |  8-Jan-19 |  8-Jan-19 |    START    |
| 103561375 | 7550 |  8-Jan-19 |  8-Jan-19 |     END     |
| 103561375 | 7700 |  9-Jan-19 |  9-Jan-19 |    START    |
| 103561375 | 7700 |  9-Jan-19 |  9-Jan-19 |     END     |
| 103561375 | 7750 | 10-Jan-19 | 10-Jan-19 |    START    |
| 103561375 | 7750 | 10-Jan-19 | 10-Jan-19 |     END     |
| 103561454 | 6106 | 31-Jan-19 | 31-Jan-19 |    START    |
| 103561454 | 6106 | 31-Jan-19 | 31-Jan-19 |     END     |
| 103561454 | 6111 |  4-Feb-19 |  4-Feb-19 |    START    |
| 103561454 | 6111 |  4-Feb-19 |  4-Feb-19 |     END     |
| 103561454 | 6900 |  4-Feb-19 |  4-Feb-19 |    START    |
| 103561454 | 6900 |  4-Feb-19 |  4-Feb-19 |     END     |
| 103561454 | 6950 |  4-Feb-19 |  4-Feb-19 |    START    |
| 103561454 | 6950 |  4-Feb-19 |  4-Feb-19 |     END     |
| 103561454 | 7000 |  4-Feb-19 |  4-Feb-19 |    START    |
| 103561454 | 7000 |  4-Feb-19 |  4-Feb-19 |     END     |
| 103561454 | 7050 |  5-Feb-19 |  5-Feb-19 |    START    |
| 103561454 | 7050 |  5-Feb-19 |  5-Feb-19 |     END     |
| 103561454 | 7100 |  6-Feb-19 |  6-Feb-19 |    START    |
| 103561454 | 7100 |  6-Feb-19 |  6-Feb-19 |     END     |
| 103561454 | 7200 |  9-Feb-19 |  9-Feb-19 |    START    |
| 103561454 | 7200 |  9-Feb-19 |  9-Feb-19 |     END     |
| 103561454 | 7300 |  9-Feb-19 |  9-Feb-19 |    START    |
| 103561454 | 7300 |  9-Feb-19 |  9-Feb-19 |     END     |
| 103561454 | 7400 |  9-Feb-19 |  9-Feb-19 |    START    |
| 103561454 | 7400 |  9-Feb-19 |  9-Feb-19 |     END     |
| 103561454 | 7450 | 11-Feb-19 | 11-Feb-19 |    START    |
| 103561454 | 7450 | 11-Feb-19 | 11-Feb-19 |   PROCESS   |
| 103561454 | 7450 | 11-Feb-19 | 14-Feb-19 |    START    |
| 103561454 | 7450 | 11-Feb-19 | 14-Feb-19 |     END     |
| 103561454 | 7550 | 14-Feb-19 | 14-Feb-19 |    START    |
| 103561454 | 7550 | 14-Feb-19 | 14-Feb-19 |     END     |
| 103561454 | 7700 | 16-Feb-19 | 16-Feb-19 |    START    |
| 103561454 | 7700 | 16-Feb-19 | 16-Feb-19 |     END     |
| 103561454 | 7750 | 18-Feb-19 | 18-Feb-19 |    START    |
| 103561454 | 7750 | 18-Feb-19 | 18-Feb-19 |     END     |
目标是:

对于每个订单以及每个订单中的每个步骤,计算其队列时间,即从上一个步骤的最后结束日期到当前步骤的第一个开始日期(此步骤在待执行队列中的时间)

所以基本上,对于每一行顺序和步骤组合,我需要找到 最后一个
结束
日期(当
ProcessCode=END
时)和第一个
开始
日期(当
ProcessCode=START
时)。然后,减去这两个并报告 返回值

我试过:

SELECT
    Order,
    Step,
    (MAX(StepEnd) OVER PARTITION BY (Order, Step) - LAG(MIN(StepStart) OVER PARTITION BY (Order, Step), 1, null)) OVER PARTITION BY (
    Order, Step) AS QueueTime

FROM
    thetable
但不断出现与缺少右括号相关的错误

如何编写查询以获得结果,例如,步骤
7450
将是1。
(这些实际上是真实数据库中的
datetime
字段,但当我编辑一些结果时,结果变成了date)

关于“过度分区”的括号的语法有点错误,应该是:

MAX(“StepEnd”)超过(按“顺序”、“步骤”划分)

MIN(“步骤开始”)结束(按“顺序”、“步骤”划分)

我已尝试修复您的声明,请参见以下内容:

SELECT
    "Order",
    "Step", 
    MAX("StepEnd") -
    LAG(MIN("StepStart"), 1, NULL) OVER (ORDER BY MIN("StepStart")) AS QueueTime
    FROM
  Table1
group by "Order","Step"
你可以在这里查看我的结果


可以找到一些关于滞后函数的有用例子。似乎它总是需要一个按

排序的
我认为您需要使用
MIN
MAX
分析函数,如下所示

SELECT
    Order,
    Step,
    MAX(StepEnd) OVER PARTITION BY (Order, Step) 
    - MIN(StepStart) OVER PARTITION BY (Order, Step) AS QueueTime
    FROM
    thetable

干杯

为什么要投否决票?我认为我们需要滞后的原因是因为我们关心前一步,对吗?但是
-1
是否总是表示上一步,或者仅仅是行号?谢谢,我会在上午尝试(我已经很晚了)并返回给你…请继续关注。这不计算上一步的任何内容,因此不太正确,我需要在本周晚些时候检查。我最终找到了另一个解决方案,但我会看看这是否有效@ChristianThis没有取前一行、步骤的最小值,只是取当前值,因此仍然不太正确