2016-04-03 4 views
2

Может кто-то помочь с идеями, реализующих требования, описанные ниже:Oracle SQL-запрос Logic - Группа по по дате Разница

enter image description here

Таблица выше (на скриншоте) сохраняет историю задания запланированных процессов.

Мое требование состоит в том, чтобы таблица целей сохраняла общую историю, как показано ниже.

enter image description here

см ниже источника/целевой структуры таблицы и примеры исходного кода записей SQL:

CREATE TABLE "XHQ"."SHIFT_LOG" ("SEQUENCE_ID" NUMBER(10,0), 
"JOB_ID" NUMBER(10,0), 
"START_TS" DATE, 
"END_TS" DATE, 
"MINIMUM_VALUE" FLOAT(126), 
"MAXIMUM_VALUE" FLOAT(126), 
"AVERAGE_VALUE" FLOAT(126), 
"USERID" NVARCHAR2(80)); 

Insert into XHQ.SHIFT_LOG (SEQUENCE_ID,JOB_ID,START_TS,END_TS,MINIMUM_VALUE,MAXIMUM_VALUE,AVERAGE_VALUE,USERID) values (10908,12000,to_date('01-MAY-15','DD-MON-RR'),null,null,null,null,'admin'); 
Insert into XHQ.SHIFT_LOG (SEQUENCE_ID,JOB_ID,START_TS,END_TS,MINIMUM_VALUE,MAXIMUM_VALUE,AVERAGE_VALUE,USERID) values (10825,12000,to_date('29-APR-15','DD-MON-RR'),to_date('01-MAY-15','DD-MON-RR'),null,null,null,'admin'); 
Insert into XHQ.SHIFT_LOG (SEQUENCE_ID,JOB_ID,START_TS,END_TS,MINIMUM_VALUE,MAXIMUM_VALUE,AVERAGE_VALUE,USERID) values (10800,12000,to_date('29-APR-15','DD-MON-RR'),to_date('29-APR-15','DD-MON-RR'),5,10,7.5,'admin'); 
Insert into XHQ.SHIFT_LOG (SEQUENCE_ID,JOB_ID,START_TS,END_TS,MINIMUM_VALUE,MAXIMUM_VALUE,AVERAGE_VALUE,USERID) values (10725,10500,to_date('28-APR-15','DD-MON-RR'),to_date('29-APR-15','DD-MON-RR'),4,8,6,'admin'); 
Insert into XHQ.SHIFT_LOG (SEQUENCE_ID,JOB_ID,START_TS,END_TS,MINIMUM_VALUE,MAXIMUM_VALUE,AVERAGE_VALUE,USERID) values (10625,10500,to_date('27-APR-15','DD-MON-RR'),to_date('27-APR-15','DD-MON-RR'),6,6,6,'admin'); 
Insert into XHQ.SHIFT_LOG (SEQUENCE_ID,JOB_ID,START_TS,END_TS,MINIMUM_VALUE,MAXIMUM_VALUE,AVERAGE_VALUE,USERID) values (10620,10500,to_date('23-APR-15','DD-MON-RR'),to_date('27-APR-15','DD-MON-RR'),null,null,null,'admin'); 
Insert into XHQ.SHIFT_LOG (SEQUENCE_ID,JOB_ID,START_TS,END_TS,MINIMUM_VALUE,MAXIMUM_VALUE,AVERAGE_VALUE,USERID) values (10525,10500,to_date('22-APR-15','DD-MON-RR'),to_date('23-APR-15','DD-MON-RR'),null,null,null,'admin'); 
Insert into XHQ.SHIFT_LOG (SEQUENCE_ID,JOB_ID,START_TS,END_TS,MINIMUM_VALUE,MAXIMUM_VALUE,AVERAGE_VALUE,USERID) values (10510,10500,to_date('18-APR-15','DD-MON-RR'),to_date('20-APR-15','DD-MON-RR'),8,16,8,'admin'); 

Позвольте мне дать обзор требований.

Рассмотрим JobID = 10500

  • По sequenceid: 10510, он начал в 18-АПР и побежал по 20-АПР. После его успешного завершения он получает значение min, max, avg, соответствующее ему как сводка.

  • Однако, если мы рассмотрим последовательность id: 10525, она началась с 22-го апреля и продолжалась до 23 апреля. Однако из-за некоторого отключения сети он остановился в середине в течение нескольких минут и снова начал работу. Из-за этого он имеет значение min, max, avg как NULL, так как задание неполное. Снова у него была другая проблема с сетью на 27-м апреля, так что она была остановлена ​​и снова возобновлена. Наконец, 27-го апреля (идентификатор последовательности: 10625) он завершился успешно, и ему присвоено значение min, max, avg.

enter image description here

В этом случае записи записей, принадлежащих к 10625, 10620 и 10525 потребностей последовательности идентификаторов следует рассматривать как одну группу и start_ts из последовательности идентификаторов 10525 необходимо получить назначен sequenceid 10625, как показано ниже

enter image description here

Одно исключение выше случае, если end_ts равно нулю (последовательность ID: 10908) (это означает, в настоящее время активную работу).

enter image description here

Здесь группировка должна быть с последовательностью ID: 10825 и выход должен быть как ниже скриншоте.

enter image description here

Позвольте мне знать, если вам требуется каких-либо разъяснений.

Заранее благодарим за ваше время и ценные предложения.

ответ

2

Try:

SELECT sequence_id, job_id, new_start_ts as start_ts, end_ts, 
     minimum_value, maximum_value, average_value, userid 
FROM (
    SELECT t.*, 
      min(start_ts) over (partition by job_id, new_seq_id) As new_start_ts 
    FROM (
      SELECT t.* , 
       first_value(case when minimum_value is not null then sequence_id end IGNORE NULLS) 
       over (partition by job_id order by sequence_id rows between current row and unbounded following) as new_seq_id 
      FROM SHIFT_LOG t 
    ) t 
) 
WHERE minimum_value IS NOT NULL 
    OR new_seq_id IS NULL AND end_ts IS NULL 
ORDER BY sequence_id desc; 
+0

Не могли бы вы сказать, порядок выполнения логических операторов в том, где, как это его 1) '(MINIMUM_VALUE IS NOT NULL ИЛИ new_seq_id IS NULL) И end_ts IS NULL' или это похоже на 2) 'minimum_value NOT NOT NULL OR (new_seq_id IS NULL AND end_ts IS NULL)'. Я имею в виду, что оценивается первым. –

+0

@sql_dummy Стандарт SQL не определяет порядок оценки условия 'x OR y AND z', в отличие от, например, Java, C++. База данных свободна в выборе любого порядка оценки, это лучше. SQL - это декларативный язык. Меня не интересует порядок оценки, я только объявляю: «Дайте мне строки, для которых условие« x OR y AND z »истинно» – krokodilko

+0

, но разве это не изменит результат? Предположим, что если 'x истинно, y является ложным, z является ложным' в' case1', где условие вернет false и в 'case2', где условие вернет true –

Смежные вопросы