Условно выполнить запаздывающий расчет MAX и MIN - Oracle SQL - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть таблица данных примерно так:

|   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     |

Цель будет:

Для каждого заказа и для каждого шага в каждом заказе рассчитайте время очереди это время от ДАТА ПОСЛЕДНЕГО КОНЦА до текущего шага ДАТА ПЕРВОГО НАЧАЛА (время этого шагабыл в очереди, чтобы быть выполненным).

Таким образом, в основном, для каждой комбинации Порядка и Шага я должен найти последнюю END дату (когда ProcessCode = END) и первую STARTдата (когда 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 поля в реальной базе данных, но когда я редактировал некоторые результаты, он превратился в просто дату)

1 Ответ

0 голосов
/ 25 сентября 2019

Ваш синтаксис относительно круглых скобок для переразделения немного неверен.Я пробовал первую часть выбора, используя MAX( "StepEnd" ) OVER ( PARTITION BY "Order", "Step" ) и MIN( "StepStart" ) OVER ( PARTITION BY "Order", "Step" ).Мне еще не удалось запустить LAG.

Может быть, есть даже более простое решение.Я проверил это с целыми числами вместо дат (поскольку мне не ясно, как ваши значения выглядят в реальности) и придумал довольно простое решение, предполагая, что значение для StepEnd всегда больше, чем значение для StepStart.

Группировка по приводит к правильным значениям для минимального / максимального значения.

http://sqlfiddle.com/#!4/d80532/4/0

Настройка:

CREATE TABLE Table1
    ("Order" varchar2(11), "Step" varchar2(6), "StepStart" NUMBER, "StepEnd" NUMBER, "ProcessCode" varchar2(13))
;

INSERT ALL 
    INTO Table1 ("Order", "Step", "StepStart", "StepEnd", "ProcessCode")
         VALUES ('103502090', '6950', 1, 1000, 'START')
    INTO Table1 ("Order", "Step", "StepStart", "StepEnd", "ProcessCode")
         VALUES ('103502090', '6950', 2, 2000, 'END')
    INTO Table1 ("Order", "Step", "StepStart", "StepEnd", "ProcessCode")
         VALUES ('103502091', '7000', 5, 1000, 'END')
    INTO Table1 ("Order", "Step", "StepStart", "StepEnd", "ProcessCode")
         VALUES ('103502091', '7000', 4, 3000, 'START')

ВыбратьЗаявление:

SELECT "order", 
       "step", 
       Max("stepend") - Min("stepstart") AS diff 
FROM   table1 
GROUP  BY "order", 
          "step" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...