Счет RO в Oracle PL SQL, меняя значение некоторых ячеек только в запросе - PullRequest
1 голос
/ 27 февраля 2020

У меня есть таблица Оборудования, в которой хранится: Отметка времени действия (например, начало, окончание sh, отмена, ..) текущего местоположения, источника, пункта назначения, идентификатора Box.

Теперь я выяснил Query, где я визуализирую для каждого блока, где он начался, когда он начался, где он действительно пошел и когда он туда пошел.

Это полезно для нас, так как иногда коробка не будет go к желаемому месту назначения и, таким образом, мы можем визуализировать позже, где это пошло не так, когда текущее местоположение! = место назначения и состояние задания = fini sh.

Единственная проблема в том, что иногда база данных хранит неправильные значения для стартовое местоположение.

Итак, я хочу выяснить, как использовать мой уже существующий запрос и всегда заменять источник на текущее местоположение, когда текущее действие = 'start'


SELECT JOB_NAME, startLocation, endLocation, REAL_DESTINATION, startEvent, endEvent, Starttime, 
endTime from
(
    SELECT JOB_NAME, NEW_STATUS as startEvent , CURRENT_LOCATION, SOURCE as startLocation, TIMESTAMP 
    as Starttime, 
    LEAD(CURRENT_LOCATION, 1) OVER (PARTITION by JOB_NAME order by TIMESTAMP) as DESTINATION, 
    LEAD(TIMESTAMP, 1) OVER (PARTITION by JOB_NAME order by TIMESTAMP) as endTIME,
    LEAD(NEW_STATUS, 1) OVER (PARTITION BY JOB_NAME order by TIMESTAMP) as endEvent,
    LEAD(DESTINATION, 1) OVER (Partition by JOB_NAME order by TIMESTAMP) as endLocation 
    from my_table
    WHERE TIMESTAMP >= to_date(sysdate-3)
    AND NEW_STATUS in ('Started', 'Finished', 'Canceled') AND OLD_STATUS not in ('Started', 
    'Finished', 'Canceled')
    AND TIMESTAMP >= to_date(sysdate-7)
    ORDER BY JOB_NAME, Starttime asc
)
WHERE STARTEVENT = 'Started'
AND ENDEVENT != 'Started'

Я хочу что-то вроде: если startEvent = 'start', то SourceLocation = CurrentLocation

1 Ответ

0 голосов
/ 27 февраля 2020

Будет ли case when правильным решением для вас?

SELECT JOB_NAME
       , startLocation
       , endLocation
       , startEvent
       , endEvent
       , Starttime
       , endTime 
       , case when startEvent = 'started'then CURRENT_LOCATION
              else null
         end SourceLocation 
from (SELECT JOB_NAME
             , NEW_STATUS as startEvent 
             , CURRENT_LOCATION
             , SOURCE as startLocation
             , "TIMESTAMP" as Starttime
             ,  LEAD(CURRENT_LOCATION, 1) OVER (PARTITION by JOB_NAME order by "TIMESTAMP") as DESTINATION
             ,  LEAD("TIMESTAMP", 1) OVER (PARTITION by JOB_NAME order by "TIMESTAMP") as endTIME
             ,  LEAD(NEW_STATUS, 1) OVER (PARTITION BY JOB_NAME order by "TIMESTAMP") as endEvent
             ,  LEAD(DESTINATION, 1) OVER (Partition by JOB_NAME order by "TIMESTAMP") as endLocation 
      from my_table
      WHERE "TIMESTAMP" >= to_date(sysdate-3)
      AND NEW_STATUS in ('Started', 'Finished', 'Canceled') 
      AND OLD_STATUS not in ('Started', 'Finished', 'Canceled')
      AND "TIMESTAMP" >= to_date(sysdate-7)
      ORDER BY JOB_NAME, Starttime asc
);

Примечание :

  1. Вы выбираете REAL_DESTINATION, и такого столбца нет в вашем подзапросе
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...