sql - 将一列交换到另一列
问题描述
有n个父任务,每个任务都有它们的实际开始时间和实际结束时间,现在也有子任务,对于一个以“createprovision”结尾的父任务,我想用开始时间替换结束时间以“Preparations”开头的子任务
抱歉,我正在编辑问题
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
我想用值' slc-asset:global|win-global-createprovision '任务替换名称列的实际结束时间与名称列中的Preparation Provisioning virtual的任务激活时间
希望有意义
谢谢
拉克什
解决方案
你有几个选择。可能您可以将查询重写为非联合版本,但是没有数据访问太难了,我无法为您提供帮助。第二个选项是分析函数:
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
.
推荐阅读
- linkedin - RESOURCE_KEY 中的字段值验证失败:处理字段时出现数据处理异常 [/key/developerApplication]
- angular - Angular:即使设置了标头,也会出现 CORS 错误
- parsing - 解析表单中的表达式
= - google-apps-script - 如何将过滤器本身复制到同一个谷歌电子表格中的另一张纸上?
- javascript - 选中复选框时如何禁用和启用文本框
- reactjs - Power BI Embedded - 传递身份验证令牌或用户凭据?
- python - Sudoku Solver 的 MNIST 数据集的错误预测
- rsk - 在 Windows 机器上运行 RSKj 节点时如何修复 LevelDB 库加载错误?
- github - 创建新 PR 时,如何强制 CircleCI 重新运行工作流程?
- c# - 逻辑条件之一无法正常工作