Как объединить две строки данных, предупреждающие о выключении и включении питания, в одну в Oracle в области электричества - PullRequest
0 голосов
/ 04 октября 2018

https://drive.google.com/file/d/1yakmTD5M2MEINdBEg2ckUTb3vw7YPFTO/view?usp=sharing

Можете ли вы помочь мне решить проблему, с которой я столкнулся, с помощью прикрепленного изображения с помощью SQL-запроса ORACLE

Я обновил информацию:

CREATE TABLE ALERT_EVENT (MEASUREMENT_POINT VARCHAR2(10), TIME_ALERT DATE, STATUS VARCHAR2(10));

INSERT INTO ALERT_EVENT VALUES('PE01', to_date('04/10/2018 00:00:00','dd/mm/yyyy hh24:mi:ss'), 'POWER ON');
INSERT INTO ALERT_EVENT VALUES('PE01', to_date('03/10/2018 00:00:00','dd/mm/yyyy hh24:mi:ss'), 'POWER OFF');
INSERT INTO ALERT_EVENT VALUES('PE01', to_date('02/10/2018 00:00:00','dd/mm/yyyy hh24:mi:ss'), 'POWER ON');
INSERT INTO ALERT_EVENT VALUES('PE01', to_date('01/10/2018 00:00:00','dd/mm/yyyy hh24:mi:ss'), 'POWER OFF');
INSERT INTO ALERT_EVENT VALUES('PE02',  to_date('03/10/2018 00:00:00','dd/mm/yyyy hh24:mi:ss'), 'POWER OFF'); 
INSERT INTO ALERT_EVENT VALUES('PE02',  to_date('02/10/2018 23:00:00','dd/mm/yyyy hh24:mi:ss'), 'POWER ON');
INSERT INTO ALERT_EVENT VALUES('PE02',  to_date('02/10/2018 22:00:00','dd/mm/yyyy hh24:mi:ss'), 'POWER OFF');
INSERT INTO ALERT_EVENT VALUES('PE03', to_date('04/10/2018 10:00:00','dd/mm/yyyy hh24:mi:ss'), 'POWER OFF');
INSERT INTO ALERT_EVENT VALUES('PE03',  to_date('02/10/2018 23:00:00','dd/mm/yyyy hh24:mi:ss'), 'POWER ON');
INSERT INTO ALERT_EVENT VALUES('PE03',  to_date('02/10/2018 22:00:00','dd/mm/yyyy hh24:mi:ss'), 'POWER OFF');
INSERT INTO ALERT_EVENT VALUES('PE03',  to_date('01/10/2018 00:00:00','dd/mm/yyyy hh24:mi:ss'), 'POWER ON');

Запрос Результат использования ORACLE Matching Pattern

QUERY 1:

select * 
from ALERT_EVENT ml
MATCH_RECOGNIZE (
     PARTITION BY MEASUREMENT_POINT
     ORDER BY TIME_ALERT
     MEASURES  STRT.TIME_ALERT AS start_tstamp,
               LAST(END.TIME_ALERT) AS end_tstamp
     ONE ROW PER MATCH
     AFTER MATCH SKIP TO LAST END
     PATTERN (STRT END+)
     DEFINE
        STRT as STRT.STATUS like '%OFF%' ,
        END AS END.STATUS like '%ON%' 
     ) MR
ORDER BY MEASUREMENT_POINT ,start_tstamp;

QUERY 2 Получите подробную информацию:

select * 
from ALERT_EVENT ml
 MATCH_RECOGNIZE (
     PARTITION BY MEASUREMENT_POINT
     ORDER BY TIME_ALERT
     MEASURES  STRT.TIME_ALERT AS start_tstamp,
               FINAL LAST(END.TIME_ALERT) AS end_tstamp,
               MATCH_NUMBER() AS match_num,
               CLASSIFIER() AS var_match
     ALL ROWS PER MATCH
     AFTER MATCH SKIP TO LAST END
     PATTERN (STRT END+)
     DEFINE
        STRT as STRT.STATUS like '%OFF%',
        END AS END.STATUS like '%ON%'  
     ) MR
ORDER BY MEASUREMENT_POINT ,TIME_ALERT;

Я создал таблицу и данныев соответствии с проблемой, мы выполняем запрос, используя SQL для ORACLE Matching Pattern, и получаем результат в виде текста

MEASUREMENT_POINT   START_TSTAMP    END_TSTAMP

PE01    10/1/2018   10/2/2018
PE01    10/3/2018   10/4/2018
PE02    10/2/2018 10:00:00 PM   10/2/2018 11:00:00 PM
PE03    10/2/2018 10:00:00 PM   10/2/2018 11:00:00 PM

Но пропускаем пропущенные данные 2 строки

MEASUREMENT_POINT   START_TSTAMP    END_TSTAMP

PE02    10/3/2018 1:00      null
PE03    10/4/2018 22:00     null

Проблема: Как можноЯ запрашиваю добавить 2 строки потерянных данных?

Ссылка проблемного статус-кво Изображение https://drive.google.com/file/d/12g-kjYoiXYEjbWoywd4uf9IKJKZVExFY/view?usp=sharing

1 Ответ

0 голосов
/ 05 октября 2018

Вы совсем близко, попробуйте это:

SELECT * 
FROM ALERT_EVENT ml
MATCH_RECOGNIZE (
     PARTITION BY MEASUREMENT_POINT
     ORDER BY TIME_ALERT
     MEASURES  STRT.TIME_ALERT AS start_tstamp,
               LAST(END.TIME_ALERT) AS end_tstamp
     PATTERN (STRT END*)
     DEFINE
        STRT AS STRT.STATUS LIKE '%OFF%' ,
        END AS END.STATUS LIKE '%ON%' 
     ) MR
ORDER BY MEASUREMENT_POINT ,start_tstamp;

MEASUREMENT_POINT   START_TSTAMP           END_TSTAMP
==================  =====================  ====================
PE01                2018-10-01 00:00:00    2018-10-02 00:00:00
PE01                2018-10-03 00:00:00    2018-10-04 00:00:00
PE02                2018-10-02 22:00:00    2018-10-02 23:00:00
PE02                2018-10-03 00:00:00 
PE03                2018-10-02 22:00:00    2018-10-02 23:00:00
PE03                2018-10-04 10:00:00 

Шаблон должен быть STRT END*, что означает: (точно) один POWER OFF, за которым следует ноль или много POWER ON.

ONE ROW PER MATCH по умолчанию, так что вы можете пропустить его, если хотите.AFTER MATCH SKIP TO LAST END должно быть AFTER MATCH SKIP PAST LAST ROW - это снова значение по умолчанию и, следовательно, может быть пропущено.

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