有条件地执行滞后的最大和最小计算-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没有取前一行、步骤的最小值,只是取当前值,因此仍然不太正确