[英]making duplicate columns as NULL
我有以下查询
select DISTINCT PCD.CHANGE_ID CHANGE_ID, PCD.STATUS STATUS,ICT2.TASK_ID PARENT_TASK_ID,ICT2.NAME PARENT_TASK_NAME,ICT2.STATUS PARENT_TASK_STATUS, ICT.STATUS INFRA_TASK_STATUS,
ICD.CHANGE_ID INFRA_CHANGE_ID,ICT.TASK_ID INFRA_TASK_ID,ICT.NAME INFRA_TASK_NAME
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 TASK_ORG_TOWER T1 ON T1.T_ASSIGNEE_GROUP = ICT2.ASSIGNEE_GROUP
where 1=1
AND PCD.CHANGE_ID IN ('CRQ000001349306')
AND PCD.TEMPLATE LIKE 'slc-asset%provision'
--AND PCD.TEMPLATE LIKE '%server-lifecycle:global%'
AND ICT2.STATUS NOT IN ('Staged','Closed')
AND ICT.STATUS NOT IN ('Closed','Staged')
AND PCD.STATUS NOT IN ('Closed','Completed','Cancelled')
And TRUNC(TIMEZONE_CONVERT(PCD.SCHEDULED_START_DATE)) >= to_date('2019-04-29','YYYY-MM-DD');
逻辑是一个开放的 change_id 可以有多个开放的基础设施或可以打开的子任务,所以在这个查询中我提取一个单一的 change_id,所以基本上对于这些情况,父/更改 id 将重复。
现在我想为列 change_id、status、parent_task_id、parent_task_status 保留第一个不同的值,并使该列的所有其他事件为空,因为很明显所有这些列都在重复
谢谢拉克什
您可以尝试使用 ROW_NUMBER() 然后使用 CASE 仅在第一行显示列内容。 我毫不费力地了解您的数据,提供以下信息:
WITH
Test_Data AS
(
SELECT 'CI 01' AS CHANGE_ID, 'SPTI 01' AS STATUS, 'PTI 01' AS PARENT_TASK_ID, 'PTN 01' AS PARENT_TASK_NAME, 'PTS 01' AS PARENT_TASK_STATUS, 'ITS 01a' AS INFRA_TASK_STATUS, 'ICI 01a' AS INFRA_CHANGE_ID, 'ITI 01a' AS INFRA_TASK_ID, 'ITN 01a' AS INFRA_TASK_NAME FROM DUAL UNION ALL
SELECT 'CI 01' AS CHANGE_ID, 'SPTI 01' AS STATUS, 'PTI 01' AS PARENT_TASK_ID, 'PTN 01' AS PARENT_TASK_NAME, 'PTS 01' AS PARENT_TASK_STATUS, 'ITS 01b' AS INFRA_TASK_STATUS, 'ICI 01b' AS INFRA_CHANGE_ID, 'ITI 01b' AS INFRA_TASK_ID, 'ITN 01b' AS INFRA_TASK_NAME FROM DUAL UNION ALL
SELECT 'CI 01' AS CHANGE_ID, 'SPTI 01' AS STATUS, 'PTI 01' AS PARENT_TASK_ID, 'PTN 01' AS PARENT_TASK_NAME, 'PTS 01' AS PARENT_TASK_STATUS, 'ITS 01c' AS INFRA_TASK_STATUS, 'ICI 01c' AS INFRA_CHANGE_ID, 'ITI 01c' AS INFRA_TASK_ID, 'ITN 01c' AS INFRA_TASK_NAME FROM DUAL UNION ALL
SELECT 'CI 02' AS CHANGE_ID, 'SPTI 02' AS STATUS, 'PTI 02' AS PARENT_TASK_ID, 'PTN 02' AS PARENT_TASK_NAME, 'PTS 02' AS PARENT_TASK_STATUS, 'ITS 02a' AS INFRA_TASK_STATUS, 'ICI 02a' AS INFRA_CHANGE_ID, 'ITI 01c' AS INFRA_TASK_ID, 'ITN 01c' AS INFRA_TASK_NAME FROM DUAL
)
,Detail AS
(
SELECT
Change_id
,Status
,Parent_Task_Id
,Parent_Task_Name
,Parent_Task_Status
,Infra_Task_Status
,Infra_Change_Id
,Infra_Task_Id
,Infra_Task_Name
,ROW_NUMBER() OVER (PARTITION BY Change_id, Status,Parent_Task_Id, Parent_Task_Name, Parent_Task_Status ORDER BY Infra_Task_Status) AS Test_Condition
FROM Test_Data
)
SELECT
CASE WHEN Test_Condition = 1 THEN Change_id ELSE NULL END AS Change_id
,CASE WHEN Test_Condition = 1 THEN Status ELSE NULL END AS Status
,CASE WHEN Test_Condition = 1 THEN Parent_Task_Id ELSE NULL END AS Parent_Task_Id
,CASE WHEN Test_Condition = 1 THEN Parent_Task_Name ELSE NULL END AS Parent_Task_Name
,CASE WHEN Test_Condition = 1 THEN Parent_Task_Status ELSE NULL END AS Parent_Task_Status
,Infra_Task_Status
,Infra_Change_Id
,Infra_Task_Id
,Infra_Task_Name
FROM Detail
;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.