Перестановка одного столбца в другой - PullRequest
0 голосов
/ 11 марта 2020

Существует n количество родительских задач, и у каждой задачи есть фактическое время начала и фактическое время окончания, теперь есть и дочерние задачи, для одной родительской задачи, которая заканчивается на 'createprovision', я хочу заменить время окончания на время начала дочерней задачи, которая начинается с «Подготовка»

Извините, я редактирую вопрос

SELECT DISTINCT PCD.CHANGE_ID PARENT_CHANGE_ID,ICT2.TASK_ID PARENT_TASK_ID  
, NULL as INFRA_CHANGE_ID, NULL as INFRA_TASK_ID, NULL as OPS_CAT3,  
ICT2.ACTIVATE_TIME TASK_ACTIVATE_TIME,  
ICT2.ACTUAL_END_DATE ASK_ACTUAL_END_TIME,  
ICT2.SEQUENCE PARENT_SEQ,  
NULL as INFRA_SEQ,  
ICT2.NAME  
--ROUND(Business_Hours(timezone_convert(ICT2.ACTUAL_START_DATE), timezone_convert(ICT2.ACTUAL_END_DATE)  
--,7,18,'Sat/Sun'),2) TASK_MTRS_IN_HRS  
FROM   
V_ITSM_REPORT_CHANGE_DATA PCD  
JOIN V_ITSM_REPORT_CHANGE_TASK PCT ON PCD.CHANGE_ID=PCT.CHANGE_ID  
LEFT JOIN V_ITSM_REPORT_CHANGE_RELATIONS CR ON PCD.CHANGE_ID=CR.REQUEST_ID  
LEFT JOIN V_ITSM_REPORT_CHANGE_DATA ICD ON ICD.CHANGE_ID=CR.CHANGE_ID  
JOIN V_ITSM_REPORT_CHANGE_TASK ICT ON ICT.CHANGE_ID=ICD.CHANGE_ID   
JOIN V_ITSM_REPORT_CHANGE_TASK ICT2 ON ICT2.CHANGE_ID = PCD.CHANGE_ID  
JOIN V_ITSM_REPORT_CHANGE_TASK_WI WI ON WI.TASK_ID = ICT.TASK_ID   
where 1=1  
AND PCD.CHANGE_ID = 'CRQ000001307652'  
GROUP BY  
PCD.CHANGE_ID,  
ICT2.TASK_ID,  
ICT2.ACTIVATE_TIME,  
ICT2.ACTUAL_END_DATE,  
ICT2.SEQUENCE,  
ICT2.NAME  
UNION  
SELECT DISTINCT PCD.CHANGE_ID PARENT_CHANGE_ID, NULL as PARENT_TASK_ID,  
ICD.CHANGE_ID INFRA_CHANGE_ID,ICT.TASK_ID INFRA_TASK_ID,  
ICD.OPS_CAT3 OPS_CAT3,  
ICT.ACTIVATE_TIME TASK_ACTIVATE_TIME,  
ICT.ACTUAL_END_DATE TASK_ACTUAL_END_TIME,  
NULL AS PARENT_SEQ,  
ICT.SEQUENCE INFRA_SEQ,  
ICT.NAME  
--ROUND(Business_Hours(timezone_convert(ICT.ACTUAL_START_DATE), timezone_convert(ICT.ACTUAL_END_DATE)  
--,7,18,'Sat/Sun'),2) TASK_MTRS_IN_HRS  
FROM   
V_ITSM_REPORT_CHANGE_DATA PCD  
JOIN V_ITSM_REPORT_CHANGE_TASK PCT ON PCD.CHANGE_ID=PCT.CHANGE_ID  
LEFT JOIN V_ITSM_REPORT_CHANGE_RELATIONS CR ON PCD.CHANGE_ID=CR.REQUEST_ID  
LEFT JOIN V_ITSM_REPORT_CHANGE_DATA ICD ON ICD.CHANGE_ID=CR.CHANGE_ID  
JOIN V_ITSM_REPORT_CHANGE_TASK ICT ON ICT.CHANGE_ID=ICD.CHANGE_ID   
JOIN V_ITSM_REPORT_CHANGE_TASK_WI WI ON WI.TASK_ID = ICT.TASK_ID   
where 1=1  
AND PCD.CHANGE_ID = 'CRQ000001307652'  
GROUP BY  
PCD.CHANGE_ID,  
ICD.CHANGE_ID,  
ICD.OPS_CAT3,  
ICT.TASK_ID,  
ICT.ACTIVATE_TIME,  
ICT.ACTUAL_END_DATE,  
ICT.SEQUENCE,   
ICT.NAME  
order by PARENT_SEQ, INFRA_SEQ  

Вывод The output of the above code

Я хочу заменить фактическое время окончания из name столбца значением ' sl c -asset: global | win-global-createprovision ' задачей Время активации задачи Подготовка Подготовка виртуальная в столбце имя

Надеюсь, что это имеет смысл

Спасибо

Грабли sh

Ответы [ 2 ]

0 голосов
/ 11 марта 2020

Вы можете использовать CASE..WHEN и analytical function следующим образом:

SELECT
    PARENT_CHANGE_ID,
    PARENT_TASK_ID,
    INFRA_CHANGE_ID,
    INFRA_TASK_ID,
    OPS_CAT3,
    -- FOLLOWING IS THE CHANGE NEEDED FOR REQUIRED OUTPUT
    CASE
        WHEN NAME <> 'slc-asset:global|win-global-createprovision' 
        THEN TASK_ACTIVATE_TIME
        ELSE MIN(CASE WHEN NAME = 'Preparation Provisioning virtual' 
                      THEN TASK_ACTUAL_END_TIME
                 END) OVER(PARTITION BY PARENT_CHANGE_ID)
    END AS TASK_ACTIVATE_TIME, -- THIS IS YOUR OUTPUT
    TASK_ACTUAL_END_TIME,
    PARENT_SEQ,
    INFRA_SEQ,
    NAME
FROM
    (
        SELECT DISTINCT
            PCD.CHANGE_ID          PARENT_CHANGE_ID,
            ICT2.TASK_ID           PARENT_TASK_ID,
            NULL AS INFRA_CHANGE_ID,
            NULL AS INFRA_TASK_ID,
            NULL AS OPS_CAT3,
            ICT2.ACTIVATE_TIME     TASK_ACTIVATE_TIME,
            ICT2.ACTUAL_END_DATE   ASK_ACTUAL_END_TIME,
            ICT2.SEQUENCE          PARENT_SEQ,
            NULL AS INFRA_SEQ,
            ICT2.NAME  
--ROUND(Business_Hours(timezone_convert(ICT2.ACTUAL_START_DATE), timezone_convert(ICT2.ACTUAL_END_DATE)  
--,7,18,'Sat/Sun'),2) TASK_MTRS_IN_HRS  
        FROM
            V_ITSM_REPORT_CHANGE_DATA PCD
            JOIN V_ITSM_REPORT_CHANGE_TASK PCT ON PCD.CHANGE_ID = PCT.CHANGE_ID
            LEFT JOIN V_ITSM_REPORT_CHANGE_RELATIONS CR ON PCD.CHANGE_ID = CR.REQUEST_ID
            LEFT JOIN V_ITSM_REPORT_CHANGE_DATA ICD ON ICD.CHANGE_ID = CR.CHANGE_ID
            JOIN V_ITSM_REPORT_CHANGE_TASK ICT ON ICT.CHANGE_ID = ICD.CHANGE_ID
            JOIN V_ITSM_REPORT_CHANGE_TASK ICT2 ON ICT2.CHANGE_ID = PCD.CHANGE_ID
            JOIN V_ITSM_REPORT_CHANGE_TASK_WI WI ON WI.TASK_ID = ICT.TASK_ID
        WHERE
            1 = 1
            AND PCD.CHANGE_ID = 'CRQ000001307652'
        GROUP BY
            PCD.CHANGE_ID,
            ICT2.TASK_ID,
            ICT2.ACTIVATE_TIME,
            ICT2.ACTUAL_END_DATE,
            ICT2.SEQUENCE,
            ICT2.NAME
        UNION
        SELECT DISTINCT
            PCD.CHANGE_ID         PARENT_CHANGE_ID,
            NULL AS PARENT_TASK_ID,
            ICD.CHANGE_ID         INFRA_CHANGE_ID,
            ICT.TASK_ID           INFRA_TASK_ID,
            ICD.OPS_CAT3          OPS_CAT3,
            ICT.ACTIVATE_TIME     TASK_ACTIVATE_TIME,
            ICT.ACTUAL_END_DATE   TASK_ACTUAL_END_TIME,
            NULL AS PARENT_SEQ,
            ICT.SEQUENCE          INFRA_SEQ,
            ICT.NAME  
--ROUND(Business_Hours(timezone_convert(ICT.ACTUAL_START_DATE), timezone_convert(ICT.ACTUAL_END_DATE)  
--,7,18,'Sat/Sun'),2) TASK_MTRS_IN_HRS  
        FROM
            V_ITSM_REPORT_CHANGE_DATA PCD
            JOIN V_ITSM_REPORT_CHANGE_TASK PCT ON PCD.CHANGE_ID = PCT.CHANGE_ID
            LEFT JOIN V_ITSM_REPORT_CHANGE_RELATIONS CR ON PCD.CHANGE_ID = CR.REQUEST_ID
            LEFT JOIN V_ITSM_REPORT_CHANGE_DATA ICD ON ICD.CHANGE_ID = CR.CHANGE_ID
            JOIN V_ITSM_REPORT_CHANGE_TASK ICT ON ICT.CHANGE_ID = ICD.CHANGE_ID
            JOIN V_ITSM_REPORT_CHANGE_TASK_WI WI ON WI.TASK_ID = ICT.TASK_ID
        WHERE
            1 = 1
            AND PCD.CHANGE_ID = 'CRQ000001307652'
        GROUP BY
            PCD.CHANGE_ID,
            ICD.CHANGE_ID,
            ICD.OPS_CAT3,
            ICT.TASK_ID,
            ICT.ACTIVATE_TIME,
            ICT.ACTUAL_END_DATE,
            ICT.SEQUENCE,
            ICT.NAME
    ) -- ORDER BY should be applied to outer query for its proper effect
ORDER BY
    PARENT_SEQ,
    INFRA_SEQ

Cheers !!

0 голосов
/ 11 марта 2020

У вас есть несколько вариантов. Возможно, вы могли бы переписать запрос в несоюзную версию, но это слишком сложно без доступа к данным, и я не могу вам в этом помочь. Второй вариант - аналитическая функция:

select other_columns...,

       case name when 'slc-asset:global|win-global-createprovision' 
            then max(case when name = 'Preparation Provisioning virtual' 
                          then task_activate_time 
                     end) 
                 over (partition by parent_change_id)
            else task_actual_end_time
       end task_actual_end_time

  from (your_query)         

Третий вариант - подзапрос в первой части объединения. Если ваша таблица может содержать более одной такой строки, используйте min(task_activate_time) или найдите подходящую строку, которая должна быть представлена ​​в такой ситуации.

case when ict2.name = 'slc-asset:global|win-global-createprovision' 
     then (select activate_time 
             from v_itsm_report_change_task 
             where change_id = icd.change_id 
               and name = 'Preparation Provisioning virtual')
     else ict2.actual_end_date 
end task_actual_end_time

Вы используете group by, затем distinct, затем union , Это все дорогостоящие агрегаты. Я думаю, что вы можете удалить distinct и изменить union на union all.

...