Использование функции LAG с указанным c условием - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть таблица в следующем формате.

enter image description here

Я могу преобразовать таблицу в формат ниже, используя функцию LAG в oracle SQL.

enter image description here

Тем не менее, я хочу, чтобы эта таблица результатов была создана таким образом, чтобы для строк, в которых статус имеет значение «ON», to_date должен укажите дату следующей даты выключения. Вот как это должно выглядеть:

enter image description here

Как мы можем сделать это в Oracle SQL?

1 Ответ

1 голос
/ 22 апреля 2020

Я думаю, что вам нужно условное lead() с опцией ignore nulls:

select 
    id,
    date from_date,
    case when status = 'ON' 
        then lead(case when status = 'OFF' then date end ignore nulls) 
            over(partition by id order by date)
    end to_date,
    status
from mytable

Чтобы лучше соответствовать ожидаемым результатам, мы применяем функцию к любому состоянию, отличному от 'OFF', и снимаем 1 день от результата:

select 
    id,
    date from_date,
    case when status <> 'OFF' 
        then lead(case when status = 'OFF' then date end ignore nulls) 
            over(partition by id order by date) - 1
    end to_date,
    status
from mytable

Если вам также нужна следующая 'ON' дата для 'OFF' строк:

select 
    id,
    date from_date,
    case when status <> 'OFF' 
        then lead(case when status = 'OFF' then date end ignore nulls) 
            over(partition by id order by date) - 1
        else lead(case when status = 'ON' then date end ignore nulls) 
            over(partition by id order by date) - 1
    end to_date,
    status
from mytable

Демонстрация в DB Fiddlde

Первый запрос:

   ID | FROM_DATE | TO_DATE   | STATUS
----: | :-------- | :-------- | :-----
15643 | 10-MAR-20 | 20-MAR-20 | ON    
15643 | 15-MAR-20 | <em>null</em>      | test  
15643 | 20-MAR-20 | <em>null</em>      | OFF   

Второй запрос:

   ID | FROM_DATE | TO_DATE   | STATUS
----: | :-------- | :-------- | :-----
15643 | 10-MAR-20 | 19-MAR-20 | ON    
15643 | 15-MAR-20 | 19-MAR-20 | test  
15643 | 20-MAR-20 | <em>null</em>      | OFF   

Третий запрос (вы не видите разницу со вторым запросом поскольку нет строки 'OFF' со следующей 'ON'):

   ID | FROM_DATE | TO_DATE   | STATUS
----: | :-------- | :-------- | :-----
15643 | 10-MAR-20 | 19-MAR-20 | ON    
15643 | 15-MAR-20 | 19-MAR-20 | test  
15643 | 20-MAR-20 | <em>null</em>      | OFF   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...